Байты не являются символами. В одиночку они не могут даже представлять символов.
В вычислительном отношении «символ» представляет собой пару числового кода (или последовательности кодов) с кодировкой или набором символов , который определяет, как коды отображаются в реальном мире. символы (или в пробел, или для управления кодами).
Только один раз в сочетании с кодировкой байты могут представлять символы. В некоторых кодировках (например, ASCII или ISO-8859-1) один байт может представлять один символ ... и многие кодировки даже совместимы с ASCII (это означает, что коды символов от 0 до 127 соответствуют определению ASCII для них). .но без оригинального отображения вы не знаете, что имеете.
Без кодирования байты являются просто 8-разрядными целыми числами.
Вы можете интерпретировать их как угодно, наложив на них кодировку. Это именно то, что вы делаете, когда вы конвертируете byte
в char
, скажем new String(myBytes)
и т. Д., Или даже редактируете файл, содержащий байты, в текстовом редакторе. (В этом случае это редактор, применяющий кодировку.) При этом вы можете даже получить что-то, что имеет смысл. Но, не зная оригинальной кодировки, вы не можете точно знать, что эти байты должны были представлять.
Это может быть даже не текст.
Например, рассмотрим последовательность байтов 0x48 0x65 0x6c 0x6c 0x6f 0x2e
. Это можно интерпретировать как:
Hello.
в ASCII и совместимых 8-битных кодировках;
dinner
в какой-то 8-битной кодировке, которую я придумал, чтобы доказать это;
䡥汬漮
в формате с обратным порядком байтов UTF-16 *;
- стальной синий пиксель, за которым следует серовато-желтоватый, в RGB;
load r101, [0x6c6c6f2e]
на каком-то неизвестном языке ассемблера процессора;
или любой другой миллион вещей. Эти шесть байтов не могут сказать вам, какая интерпретация верна.
С текстом, по крайней мере, для этого нужны кодировки.
Но если вы хотите, чтобы интерпретация была правильной, вам нужно использовать ту же кодировку, чтобы декодировать те байты, которые использовались для их генерации. Вот почему так важно знать, как был закодирован ваш текст.
Разница между потоком байтов и потоком символов заключается в том, что поток символов пытается работать с символами, а не байтами. (На самом деле он работает с единицами кода UTF-16. Но поскольку мы знаем кодировку, этого достаточно для большинства целей.) Если он обернут вокруг потока байтов, поток символов использует кодировку для преобразования байтов, считанных из базового потока байтов. char
с (или char
с записано в поток в байтах).
* Примечание: я не знаю, является ли "䡥 汬 漮" ненормативной лексикой или даже имеет какой-либо смысл ... но компьютер не знает, если вы не запрограммируете его для чтения на китайском языке.