В следующей статье будут описаны и обсуждены вышеуказанные проблемы. В качестве примера мы возьмем слово «Китайский». Поиск соответствующей информации показывает, что кодировка «Китайский» в GB2312 — «d6d0 cec4», а кодировка Unicode — «4e2d 6587». кодировка UTF — «e4b8ad e69687». (Обратите внимание, что два слова «китайский» не имеют кодировки iso8859-1, но они могут быть «представлены» кодировкой iso8859-1).
1. Базовые знания кодирования:
Самая ранняя кодировка — iso8859-1, аналогичная кодировке ascii. Однако, чтобы облегчить представление различных языков, постепенно появилось множество стандартных кодировок. Важными из них являются следующие:
1. изо8859-1
Это однобайтовая кодировка, максимальный диапазон символов, который может быть представлен, составляет 0–255. Он применяется к английским сериям. Например, кодировка буквы а — 0x61=97.
Очевидно, что диапазон символов, представленный кодировкой iso8859-1, очень узок и не может представлять китайские символы. Однако, поскольку это однобайтовая кодировка и она соответствует самой базовой единице представления компьютера, кодировка iso8859-1 по-прежнему используется во многих случаях. И во многих протоколах эта кодировка используется по умолчанию. Например, хотя слово «китайский» не существует в кодировке iso8859-1, если взять в качестве примера кодировку gb2312, это должно быть два символа «d6d0 cec4». При использовании кодировки iso8859-1 оно будет разделено на 4 байта. . Представляет собой: «d6 d0 ce c4» (фактически при сохранении тоже обрабатывается в байтах). А если это кодировка UTF, то это 6 байт «e4 b8 ad e6 96 87». Очевидно, что это представление должно быть основано на другой кодировке.
2. ГБ2312/ГБК
Это национальный стандартный код Ханзи, который специально используется для представления китайских символов. Это двухбайтовая кодировка, английские буквы соответствуют стандарту iso8859-1 (совместимы с кодировкой iso8859-1). Среди них кодировка gbk может использоваться для одновременного представления традиционных китайских и упрощенных символов, тогда как gb2312 может представлять только упрощенные символы.
3.Юникод
Это наиболее унифицированная кодировка, которую можно использовать для представления символов на всех языках, и это двухбайтовая (также четырехбайтовая) кодировка фиксированной длины, включая английские буквы. Таким образом, можно сказать, что он не совместим с кодировкой iso8859-1 и не совместим ни с какой кодировкой. Однако по сравнению с кодировкой iso8859-1, кодировка Uniocode добавляет только 0 байт впереди, например, буква a — «00 61».
Следует отметить, что кодировка фиксированной длины легко обрабатывается компьютерами (обратите внимание, что GB2312/GBK не является кодировкой фиксированной длины), а Юникод можно использовать для представления всех символов, поэтому кодировка Юникод используется внутри многих программ. например Ява.
4.UTF
Учитывая, что кодировка Unicode несовместима с кодировкой iso8859-1, и она легко занимает больше места: поскольку для представления английских букв Unicode также требует двух байтов. Так что юникод не удобен для передачи и хранения. Поэтому была создана кодировка UTF. Кодировка UTF совместима с кодировкой ISO8859-1 и также может использоваться для представления символов на всех языках. Однако кодировка UTF представляет собой кодировку переменной длины, а длина каждого символа варьируется от 1 до 6. байты. Кроме того, кодировка UTF имеет простую функцию проверки. Вообще говоря, английские буквы представлены одним байтом, а китайские иероглифы — тремя байтами.
Обратите внимание: хотя UTF используется для использования меньшего количества места, его сравнивают только с кодировкой Unicode. Если вы уже знаете, что это китайские символы, использование GB2312/GBK, несомненно, является наиболее экономичным. Но с другой стороны, стоит отметить, что хотя кодировка UTF использует 3 байта для китайских символов, даже для веб-страниц с китайскими символами кодировка UTF сэкономит больше, чем кодировка Unicode, поскольку веб-страница содержит много английских символов.
2. Обработка символов Java
При написании приложений Java будет много мест, связанных с кодировкой набора символов. Некоторые места требуют правильных настроек, а некоторые требуют определенной степени обработки.
1.getBytes(кодировка)
Это стандартная функция для обработки строк Java. Ее функция заключается в кодировании символов, представленных строкой, в соответствии с кодировкой и представлении их в байтах. Обратите внимание, что строки всегда хранятся в памяти Java в кодировке Unicode. Например, «Китайский» при нормальных обстоятельствах сохраняется как «4e2d 6587» (то есть, когда нет ошибки). Если кодировка «gbk», она кодируется как «d6d0 cec4», а затем байты «d6». d0 ce c4" возвращаются. Если кодировка «utf8», конец будет «e4 b8 ad e6 96 87». Если это «iso8859-1», поскольку он не может быть закодирован, в конце концов возвращается «3f 3f» (Примечание: «3f 3f» — это два вопросительных знака).
2. новая строка (кодировка)
Это еще одна стандартная функция для обработки строк Java. Она противоположна предыдущей функции. Она объединяет и идентифицирует массив байтов в соответствии с кодировкой и, наконец, преобразует его в Юникод для хранения. Ссылаясь на приведенный выше пример getBytes, и «gbk», и «utf8» могут дать правильный результат «4e2d 6587», но iso8859-1 в конечном итоге становится «003f 003f» (два вопросительных знака).
Поскольку utf8 можно использовать для представления/кодирования всех символов, new String( str.getBytes( "utf8" ), "utf8" ) === str, что полностью обратимо.
3. SetCharacterEncoding()
Эта функция используется для установки http-запросов или соответствующей кодировки.
Для запроса это относится к кодировке отправленного контента. После указания вы можете напрямую получить правильную строку с помощью getParameter(). Если не указано, по умолчанию используется кодировка iso8859-1, которая требует дальнейшей обработки. См. «Ввод формы» ниже. Стоит отметить, что getParameter() не может быть выполнен до выполнения setCharacterEncoding(). В документе Java указано: Этот метод необходимо вызывать до чтения параметров запроса или чтения входных данных с помощью getReader().