При столкновении с потоком байтов его фактическое значение не может быть известно без указания его кодирования.
Это предложение также должно быть тем, что мы всегда помним в наших умах, когда сталкивались с проблемой «характера к байту, байту к характеру». В противном случае, искаженные проблемы могут следовать.
На самом деле, сущность искаженной проблемы заключается в том, что кодирование и декодирование не используют такую же кодирование. Если вы понимаете этот принцип, легко решить искаженную проблему.
Обычно используется на Java следующие:
1. Класс строки использует строку конструктора (байт [] байты) байта []. Класс строки предоставляет две перегрузки одновременно (1) String (Byte [] Bytes, Charset charset)
(2) String (Byte [] Bytes, String charsetName) используется для указания кодирования.
2. Функция GetBytes Byte [] getBytes () класса строки также имеет следующие две перегрузки:
(1) Byte [] getbytes (charset charset)
(2) Byte [] Getbytes (String charsetName)
Все, что не требует указанного кодирования, получается с использованием charset платформы по умолчанию, который может быть получен с использованием System.getProperty ("file.encoding"), charset.defaultcharet ().
3. PrintStream's Print (String S) также предназначен для этой проблемы. По этой причине конструктор PrintStream не только PrintStream (файл файла) и PrintStream (файл файла, строка CSN)
В противном случае символы строки преобразуются в байты в соответствии с кодированием символов платформы по умолчанию,
Конструкция DataOutputStream не имеет метода для указания кодирования, но она предоставляет writeutf (String Str)
Приведите примеры в начале, чтобы проиллюстрировать необходимость определения кодирования:
Если веб-страница указывает кодирование как UTF-8, <meta http-equiv = "content-type" content = "text /html; charset = utf-8" />, на странице есть форма, представленная на сервис
Затем поток байтов, переданный символами, введенными пользователем, кодирует в соответствии с указанным кодированием. Например, если вы вводите «Привет, привет», если это UTF-8, то передача выглядит следующим образом:
[104, 101, 108, 108, 111, -28, -67, -96, -27, -91, -67]
, Мы видим, что каждый из следующих китайских иерогене использует 3 байта, которые можно использовать для обозначения соответствующих знаний UTF-8.
Но если ваша страница указывает GBK, то передача будет другой:
[104, 101, 108, 108, 111, -60, -29, -70, -61]
Поэтому при использовании request.getParameter на стороне сервлета его следует называть внутри
String S = New String (bytes, response.getEncoding ()). Если ваш ответ не устанавливает кодирование, то кодирование по умолчанию NULL будет преобразовано в GBK для платформы Java, а затем китайцы станут искаженными.
Следовательно, чтобы избежать искаженного кода, сайты JSP обычно устанавливают фильтр, и все страницы и служащие должны иметь унифицированное кодирование. response.setEncoding, request.SetEncoding.
Внутри Java String находится Char [], который представляет собой устройство, закодированное с UTF-16, хранящимся 16-битной. С этой целью, при преобразовании символов и строк в байты и вывода их в файлы или сети, или возвращающиеся байтовые потоки, считываемые из файлов или сетей в символы с практической значимостью, вы должны понимать, что это за кодирование.
Некоторый опыт
1. Класс строки всегда хранится в кодировании Unicode.
2. Обратите внимание на использование string.getbytes ():
Если параметр набора символов не включен, он будет зависеть от кодирования набора символов JVM. Обычно это Unicode на Linux и GBK под Windows. (Если вы хотите изменить набор символов по умолчанию, кодирование JVM, используйте опцию -dfile.encodeing = UTF -8 при запуске JVM.
По соображениям безопасности рекомендуется всегда звонить с параметрами, например: String S; S.GetBytes ("UTF-8").
3. Класс Charset очень полезен.
(1) charset.encode кодирует, то есть кодирование строки в формате кодирования символов, который вы указываете, и выводит байтовый массив.
(2) charset.decode декодируется, то есть декодирует массив байтов в формате кодирования символов, который вы указываете, и выводит его в строку.
В качестве примера:
String s = charset.defaultCharset (). DisplayName (); String S1 = "Мне нравится, моя любовь"; Bytebuffer bb1 = bytebuffer.wrap (s1.getbytes ("utf-8")); для (byte bt: bb1.array ()) {system.out.printf ("%x", bt); } // char [] использование char [] charray = {'i', 'l', 'o', 'v', 'e', 'you'}; // charbuffer Использование Charbuffer cb = charbuffer.wrap (charray); // указатель репозиции cb.flip (); String S2 = новая строка (charray); // использование Bytebuffer bytebuffer bb2 = charset.forname ("utf-8"). Encode (cb); // Использование charset для кодирования в качестве указанного символа набора символов bytebuffer bb3 = charset.forname ("utf-8"). Encode (s1); byte [] b = bb3.array (); // Использование charset для декодирования в качестве строки в соответствии с указанным набором символов Bytebuffer bb4 = bytebuffer.wrap (b); String s2 = charset.forname ("utf-8"). Декод (bb4) .toString ();