Kodlama ve karakter kümesi arasındaki fark nedir?


151

Metin kodlama ve karakter kümesi hakkında kafam karıştı. Birçok nedenden dolayı, yaklaşan çalışmamda Unicode olmayan, UTF8 olmayan şeyler öğrenmem gerekiyor.

E-posta başlıklarında "charset" kelimesini "ISO-2022-JP" gibi buluyorum, ancak metin editörlerinde böyle bir kodlama yok. (Farklı metin editörlerine baktım.)

Metin kodlaması ile karakter kümesi arasındaki fark nedir? Bana bazı kullanım örneği örnekleri gösterebilirseniz sevinirim.


Yanıtlar:


144

Temelde:

  1. karakter kümesi kullanabileceğiniz karakter kümesidir
  2. kodlama, bu karakterlerin hafızaya kaydedilme şeklidir

42
Doğru, ancak gerçek kullanımda "karakter kümesi" genellikle hem karakter repertuarını hem de kodlama şemasını ifade eder .
Alan Moore

@AlanMoore Gerçekten de, insanlar "ondalık sayı" dediği gibi "ondalık ayırıcısı" olan herhangi bir sayıya atıfta bulunurlar. Gerçekten doğru değil, ama evet bazı insanların bunu böyle kullandığının farkında olmalısınız.
bvdb

2
Bu tam olarak doğru değil. Örneğin, Unicode karakter kümesine atıfta bulunur, ancak birden fazla olası kodlama vardır (UTF-8, UTF-16, UTF-32).
rghome

84

Her kodlamanın kendisiyle ilişkilendirilmiş belirli bir karakter takımı vardır, ancak belirli bir karakter kümesi için birden fazla kodlama olabilir. Karakter kümesi basitçe göründüğü gibi bir dizi karakterdir. Belirli komut dosyaları veya diller için tasarlanmış çok sayıda karakter kümesi vardır.

Bununla birlikte, neredeyse tüm dünya senaryolarını temsil edebilen bir karakter seti içeren Unicode'a geçiş yolunda ilerliyoruz. Ancak, Unicode için birden fazla kodlama vardır. Kodlama, bir karakter dizisini bayt dizesiyle eşlemenin bir yoludur. Unicode kodlama örnekleri arasında UTF-8 , UTF-16 BE ve UTF-16 LE bulunur . Bunların her birinin belirli uygulamalar veya makine mimarileri için avantajları vardır.


20
Javadoc'un yanlış bir şekilde "kodlama" yerine "karakter kümesi" kullandığını, örneğin InputStreamReader'da "Bir InputStreamReader'ın bayt akışlarından karakter akışlarına bir köprü olduğunu okuduk . kullanımları ada göre belirtilebilir veya açıkça verilebilir veya platformun varsayılan karakter kümesi kabul edilebilir. " . Ancak, bunların anlamı "kodlama" dır.
David Tonhofer

4
Açıklaman için teşekkürler. Unicode bir karakter kümesidir ve UTF-8 , Unicode'un kodlama yollarından biridir ve UTF-16 , Unicode'un başka bir kodlama yoludur .
HongchaoZhang

47

Diğer cevaplara ek olarak bu makalenin iyi bir okuma olduğunu düşünüyorum http://www.joelonsoftware.com/articles/Unicode.html

Makale "başlıklı Olumlu Unicode ve Karakter Kümeleri (No Bahane!) Hakkında bilmeniz gereken, Mutlak Asgari Her Yazılım Geliştirici Kesinlikle yazılı" Joel Spolsky tarafından . Makale 10 yıldan daha eski ama içerik maalesef hala geçerli ...


2
Makaleyi tanıttığınız için çok teşekkürler. Bu ise iyi bir patlama.
TK.

9
Bu cevap Joel'in makalesini neden okumam gerektiğine dair kısa bir açıklama vererek geliştirilebilir .
james.garriss

@mattanja Sağladığınız bağlantı gerçekten harika. Paylaşım için teşekkürler. Oy verildi.
hagrawal

1
Ayrıca Joel Spolsky'nin eki olan bu harika makaleyi de koymak istiyorum; kunststube.net/encoding
mkb

İlk okuduğumda Joel'in makalesini anlamadım. Aksine ben daha net ve spesifik olarak bu powerpoint bulundu: unicode.org/notes/tn23/Muller-Slides+Narr.pdf
johnsimer

27

Bir karakter kodlaması şunlardan oluşur:

  1. Desteklenen karakter kümesi
  2. Karakterler ve tamsayılar arasında bir eşleme ("kod noktaları")
  3. Kod noktaları bir dizi "kod birimi" olarak nasıl kodlanır (ör. UTF-16 için 16 bitlik birimler)
  4. Kod birimleri baytlara nasıl kodlanır (ör. Big-endian veya little-endian)

Adım # 1 tek başına bir "karakter dağarcığı" veya soyut "karakter kümesi" ve # 1 + # 2 = bir "kodlu karakter kümesi" dir.

Ancak Unicode popüler olmadan ve herkes (Doğu Asyalılar hariç) tek baytlık kodlama kullanmadan önce, 3. ve 4. adımlar önemsizdi (kod noktası = kod birimi = bayt). Böylece, eski protokoller "karakter kodlaması" ile "kodlanmış karakter kümesi" arasında net bir ayrım yapmamıştır. Eski protokoller charset, gerçekten kodlama anlamına geldiklerinde kullanılır .


html META etiketinde charset = 'utf-8' i okuyabilir miyiz? çünkü uzun zaman önce tanımlanmıştı
Eildosa

26

Bundan sonra ziyaret eden insanlar için daha fazla ışık atmak, umarım faydalı olur.


Karakter seti

Her dilde karakterler vardır ve bu karakterlerin koleksiyonu o dilin “karakter kümesini” oluşturur. Bir karakter kodlandığında, benzersiz bir tanımlayıcı veya kod noktası olarak adlandırılan bir sayı atanır. Bilgisayarda, bu kod noktaları bir veya daha fazla bayt ile temsil edilecektir.

Karakter seti örnekleri: ASCII (tüm İngilizce karakterleri kapsar), ISO / IEC 646, Unicode (dünyadaki tüm canlı dillerden karakterleri kapsar)

Kodlu Karakter Seti

Kodlanmış bir karakter kümesi, her karaktere benzersiz bir sayı atandığı bir kümedir. Bu benzersiz sayıya "kod noktası" denir.
Kodlanmış karakter kümelerine bazen kod sayfaları denir.

Kodlama

Kodlama, kod noktalarını bazı baytlarla eşleştiren mekanizmadır, böylece bir karakter aynı kodlama şemasını kullanarak farklı sistemlerde eşit olarak okunabilir ve yazılabilir.

Kodlama örnekleri: ASCII, UTF-8, UTF-16, UTF-32 gibi Unicode kodlama şemaları.

Yukarıdaki 3 kavramın detaylandırılması

  • Bunu düşünün - Devanagari karakter kümesindeki 'क' karakteri UTF-16 kodlaması kullanılırken iki bayt ( ) ile temsil edilecek 2325 ondalık kod noktasına sahiptir .09 15
  • “ISO-8859-1” kodlama şemasında “ü” (bu Latin karakter kümesindeki bir karakterden başka bir şey değildir) FC“UTF-8” de C3 BCUTF-16 olarak ve UTF-16 olarak temsil ederken onaltılık ondalık değer olarak ifade edilir FE FF 00 FC.
  • Farklı kodlama şemaları farklı karakterleri temsil etmek için aynı kod noktasını kullanabilir, örneğin “ISO-8859-1” (Latin1 olarak da adlandırılır) 'é harfi için ondalık kod noktası değeri 233'tür. Ancak, ISO 8859-5'te , aynı kod noktası Kiril karakterini temsil eder 'represents'.
  • Öte yandan, Unicode karakter kümesindeki tek bir kod noktası, belge için hangi kodlamanın kullanıldığına bağlı olarak aslında farklı bayt dizilerine eşlenebilir. Kod noktası 2325 (onaltılık gösterimde 915 olan) Devanagari karakteri क, UTF-16 kodlaması ( 09 15) kullanıldığında iki bayt, UTF-8 ( E0 A4 95) ile üç bayt veya UTF-32 ile dört bayt ile temsil edilecektir. ( 00 00 09 15)

11

Bir karakter kümesi veya karakter repertuarı basitçe bir karakter kümesidir (sırasız bir koleksiyon). Kodlanmış bir karakter seti, repertuardaki her karaktere bir tamsayı (bir "kod noktası") atar. Kodlama, kod noktalarını açık bir şekilde bayt akışı olarak göstermenin bir yoludur.


Bu kabul edilen cevap olmalı. Üç kavramı açıkça tanımlar: karakter kümesi, kodlanmış karakter kümesi ve kodlama.
Marcus Junius Brutus

6

Bunun için googled. http://en.wikipedia.org/wiki/Character_encoding

Aradaki fark ince gözüküyor. Karakter kümesi terimi aslında Unicode için geçerli değildir. Unicode bir dizi soyutlamadan geçer. soyut karakterler -> kod noktaları -> kod noktalarının bayta kodlanması.

Karakter kümeleri bunu atlar ve doğrudan karakterlerden bayta atlar. bayt dizisi <-> karakter dizisi

Kısacası, kodlama: kod noktaları -> bayt karakter kümesi: karakterler -> bayt


5

Karakter seti sadece bir settir; Euro işareti içeriyor ya da içermiyor. Bu kadar.

Kodlama, bir karakter kümesinden bir tamsayı kümesine iki yönlü bir eşlemedir. Euro işaretini destekliyorsa, o karaktere belirli bir tamsayı atamalı ve başka bir karaktere atamamalıdır.


İki yönlü olması gerekiyor mu?
Jörg W Mittag

2
Kodlama ve kod çözme deterministik olmalıdır, bu yüzden gerçekten belirsiz eşlemeler olamaz. Sanırım codomain olarak bitişik olmayan bir tamsayılar kümesine sahip olabilirsiniz, ancak metin depoladığınızda alan boşa harcanır ve mühendisler boşa giden alandan nefret eder.
Kilian Foth

1
Eski karakter kodlamaları genellikle iki yönlü değildir. Örneğin, IBM437'de, hem ß hem de 0x, 0xE1 ile temsil edilir.
dan04

3

Bence, bir karakter kümesi bir kodlamanın (bir bileşenin) bir parçasıdır, kodlamanın bir karakter kümesi özniteliği vardır, bu nedenle karakter seti birçok kodlamada kullanılabilir. Örneğin unicode, UTF-8, UTF-16 ve benzeri gibi kodlamalarda kullanılan bir karakter setidir. Buradaki çizime bakın:Buradaki resme bakın

Karakter setindeki karakter, programlama dünyasındaki karakter türü anlamına gelmez, gerçek dünyada bir karakter anlamına gelir, İngilizce'de belki aynıdır, ancak diğer dillerde, Çince gibi, '我' karakter kümelerinde ayrılmaz bir 'karakter' değildir (UNICODE, GB [GBK ve GB2312'de kullanılır]), 'a' karakter kümelerindeki bir karakterdir (ASCII, ISO-8859 , UNICODE).


1

Kanımca "karakter kümesi" kelimesi HTTP, MIME ve benzer standartlarda kullanılan ve bir karakter kodlaması (bir dizi metin karakterinden bir bayt dizisine eşleme) belirtmek için kullanılan parametrenin tanımlanması ile sınırlandırılmalıdır. Örneğin: charset=utf-8.

Yine de, MySQL, Java ve diğer yerlerin "karakter kümesi" kelimesini bir karakter kodlaması için kullanabileceğini biliyorum.


1

Kodlama, bir karakter kümesindeki baytlar ve karakterler arasındaki bir eşlemedir, bu nedenle baytlar ve karakterler arasındaki farkı tartışmak ve anlamak yararlı olacaktır .

Baytları 0 ile 255 arasında sayılar olarak düşünürken karakterler "a", "1", "$" ve "Ä" gibi soyut şeylerdir. Kullanılabilir tüm karakter kümesine karakter kümesi denir .

Her karakter, onu temsil etmek için kullanılan bir veya daha fazla baytlık bir diziye sahiptir; ancak, baytların tam sayısı ve değeri kullanılan kodlamaya bağlıdır ve birçok farklı kodlama vardır.

Çoğu kodlama, karakter başına tek bir bayt (aslında sadece 7 bit) olan ve ABD İngilizcesinde kullanılan ortak karakterlerin birçoğunu içeren 128 karakter içeren eski bir karakter kümesine ve ASCII adı verilen kodlamaya dayanır.

Örneğin, ASCII karakter kümesinde 60 ila 65 değerleri ile temsil edilen 6 karakter vardır.

Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║  Character   ║
╠══════╬══════════════║
║  60  ║      <       ║
║  61  ║      =       ║
║  62  ║      >       ║
║  63  ║      ?       ║
║  64  ║      @       ║
║  65  ║      A       ║
╚══════╩══════════════╝

Tam ASCII kümesinde, kullanılan en düşük değer sıfır ve en yüksek değer 127'dir (her ikisi de gizli kontrol karakteridir).

Bununla birlikte, temel ASCII'nin sağladığından daha fazla karaktere ihtiyacınız olduğunda (örneğin, aksanlı harfler, para birimi simgeleri, grafik sembolleri vb.), ASCII uygun değildir ve daha kapsamlı bir şeye ihtiyacınız vardır. 128 karakter tüm karakterlere sığması için yeterli olmadığından daha fazla karaktere (farklı bir karakter setine) ve farklı bir kodlamaya ihtiyacınız vardır. Bazı kodlamalar bir bayt (256 karakter) veya altı bayta kadar sunar.

Zamanla birçok kodlama yaratıldı. Windows dünyasında CP1252 veya ISO-8859-1 vardır, oysa Linux kullanıcıları UTF-8'i tercih etme eğilimindedir. Java yerel olarak UTF-16 kullanır.

Bir kodlamadaki bir karakter için bir bayt değer sırası, başka bir kodlamada tamamen farklı bir karakter anlamına gelebilir, hatta geçersiz olabilir.

Örneğin, ISO 8859-1 , â değer bir bayt ile temsil edilir 226, oysa UTF-8 iki bayttır 195, 162. Ancak, içinde ISO 8859-1 , 195, 162iki karakter olurdu ¢, Ã .

Bilgisayarlar karakterler hakkında dahili olarak veri depoladığında veya başka bir sisteme ilettiğinde bayt depolar veya gönderir. Bir dosyayı açan veya mesaj alan bir sistemin baytları gördüğünü düşünün 195, 162. Bunların hangi karakterler olduğunu nasıl bilebilir?

Sistemin bu baytları gerçek karakterler olarak yorumlaması (ve böylece bunları göstermesi veya başka bir kodlamaya dönüştürmesi) için, kullanılan kodlamayı bilmesi gerekir. Bu nedenle kodlama XML başlıklarında görünür veya bir metin düzenleyicisinde belirtilebilir. Sisteme bayt ve karakterler arasındaki eşlemeyi söyler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.