предисловие
Проблема искаженных китайских иероглифов часто встречается в нашей повседневной жизни, так как же возникает проблема искаженных иероглифов? Как решить проблему с искажениями? В этой статье будут объединены основные концепции и примеры для объяснения, я надеюсь, что каждый сможет что-то получить.
Простой искаженный пример
package whx;
import java.io.UnsupportedEncodingException;
public class TestEncodeAndDecode {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "测试中文乱码";
byte[] b = str.getBytes("GBK");
System.out.println(new String (b,"UTF-8"));
}
}
Кодирование с помощью GBK и декодирование с помощью utf-8 приводит к искажению символов.Результаты выполнения следующие:
Связанные основные понятия
Чтобы понять основную причину искаженных символов, вам нужно сначала понятьбит, байт, символ, набор символови другие сопутствующие понятия.
кусочек
Бит — это наименьшая единица данных, хранящихся в компьютере, 1 или 0 означают 1 бит, например, 10010010 означает 8-битное двоичное число.
байт
Байт — это единица измерения, используемая компьютерными информационными технологиями для измерения объема памяти.Строка двоичных чисел, обрабатываемая как единица, представляет собой небольшую единицу, из которой состоит информация.
1 B = 8 bit (1字节等于8位)
1 KB = 1024 B = 1024 字节
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
персонаж
Символы относятся к буквам, числам, словам и символам, используемым в компьютерах, и являются наименьшей единицей доступа к данным в структурах данных. Например, a, A, B, b, big, +, *, % и т. д. представляют символ;
在 ASCII 编码中,一个英文字母字符存储需要1个字节。
在 GB 2312 编码或 GBK编码中,一个汉字字符存储需要2个字节。
在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。
在UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节
在UTF-32编码中,世界上任何字符的存储都需要4个字节
набор символов
Набор символов — это набор из нескольких символов.Существует много типов наборов символов, и каждый набор символов содержит разное количество символов. Общие имена наборов символов:
ASCII字符集
GB2312字符集
Unicode字符集
кодировать декодировать
Компьютеры знают только бинарные 1 и 0, а у людей есть свой язык.Для передачи информации между двумя сторонами должно быть преобразование слов в 0 и 1 и 0, 1 в слова.
кодирование:заключается в преобразовании текстовых символов вкомпьютер может распознать0, 1 машинный код.
расшифровка:Разобрать двоичные числа, хранящиеся в компьютере, на слова и символы.
Общие наборы символов и методы их кодирования
Общий набор символов ASCII, GBK, Unicode и т. д.
Набор символов ASCII
Набор символов ASCII: он включает отображаемые символы, такие как английские буквы, арабские цифры и западные символы, а также управляющие символы, такие как Enter и Backspace.
Кодировка ASCII: это кодировка символов, разработанная в Соединенных Штатах, используемая для преобразования английских символов в двоичные и задающая 128-символьную кодировку.
Набор символов GBXXXX
Серия GBXXXX включаетГБ2312, ГБК, ГБ18030Подходит для обмена информацией между китайской обработкой персонажей, китайской связей и другими системами.
GB2312
- Полное название — «Набор закодированных символов китайских иероглифов для обмена информацией», который поддерживает более 6000 китайских иероглифов.
- Национальный набор символов упрощенного китайского языка, совместимый с ASCII, и материковый Китай, и Сингапур используют эту кодировку.
- Каждый китайский иероглиф и символ представлен двумя байтами.
- Старший байт — от A1~F7, младший байт — от A1~FE. Код можно получить, добавив 0XA0 к старшему и младшему байтам соответственно.
GBK
- Полное название GBK — «Спецификация расширения внутреннего кода китайских иероглифов», которое расширяет GB2312, добавляет поддержку традиционных китайских иероглифов и поддерживает более 20 000 китайских иероглифов.
- Каждый китайский иероглиф и символ также представлен двумя байтами.
- Старший байт — от 81~FE, младший байт — от 40~FE.
GB18030
- GB 18030, полное название «Набор символов китайской кодировки информационных технологий», совместимый с GB2312, кодировкой GBK, может поддерживать 27484 символа.
- Используя многобайтовое кодирование переменной длины, каждое слово может состоять из 1, 2 или 4 байтов.
- 1 байт от 00~7F; 2 байта старший байт от 81~FE, младший байт от 40 до 7E и 80 до FE; 4 байта первые три байта от 81~FE, вторые четыре байта от 30~39.
Набор символов Юникода
Unicode — это схема кодировки символов, разработанная международной организацией, которая может вместить все символы и знаки в мире. Набор символов UNICODE имеет множество методов кодирования, а именно UTF-8, UTF-16 и UTF-32.
UTF-8
- Направлена на кодировку символов переменной длины Unicode.
- Он может быть использован для представления любого символа в стандарте Unicode, и его кодирование в первом байте все еще совместим с ASCII, что делает программное обеспечение после исходного сделки с персонажами ASCII без или небольшую часть изменений, вы можете продолжать использовать.
- UTF-8 использует от 1 до 4 байтов для каждой кодировки символов (для символов ASCII требуется только 1-байтовая кодировка, для латинских, греческих и т. д. требуется двухбайтовая кодировка, для китайских, японских и корейских символов используется трехбайтовая кодировка, а для других очень мало символов). используемые символы используют 4-байтовый кодовый номер)
UTF-16
- Сопоставьте абстрактные кодовые точки набора символов Unicode с последовательностью 16-битных длинных целых чисел (т. е. кодовых единиц) для хранения или передачи данных.
- По сравнению с UTF-8 UTF-16 имеет то преимущество, что большинство символов хранится в байтах фиксированной длины (2 байта), но UTF-16 не совместим с кодировкой ASCII.
UTF-32
- Соглашение для кодирования символов Unicode, использующее ровно 32 бита для каждой кодовой точки Unicode, в то время как другие кодировки Unicode используют кодировки переменной длины.
- При использовании 4-байтового кодирования скорость обработки относительно высока, но пространство тратится впустую, а скорость передачи низкая.
Пример кодирования и декодирования оценил лицо Лушан
Программисты, которых мы набираем в коде, больше всего контактируют со словом «hello». Компьютер знает только 0 и 1, как он отображает приветствие?
В предыдущем разделе мы уже знали знание кодировки и набора символов. Мы можем использовать кодировку ASCII, чтобы преобразовать «слово приветствия» в 0 и 1, которые распознает компьютер. Заинтересованные друзья могут пойти проверитьСравнительная таблица ASCII
Компьютер хранит двоичные коды приветствия, мир 0 и 1. Сначала двоичные коды декодируются в соответствующие символы, а затем отображаются на экране, и мы видим привет, мир.
Как появляется искаженный код?
Есть две основные причины искажения символов, одна из нихПроцесс кодирования текстовых символов и процесс декодирования используют разные методы кодирования., дваИскаженные символы, вызванные использованием набора символов, в котором отсутствует библиотека шрифтов..
Кодирование и декодирование используют разные методы кодирования.
В примере используется кодировка utf-8 и декодирование GBK, что приводит к искажению символов. Поскольку в utf-8 китайский символ кодируется тремя байтами, а в GBK каждый китайский символ представлен двумя байтами, поэтому генерируются искаженные символы.
Набор символов, в котором отсутствует библиотека слов
Мы знаем, что GB2312 не поддерживает традиционные символы, поэтому использование кодировки набора символов, в которой отсутствует определенная библиотека шрифтов, приведет к искажению символов.
Как решить искаженный код
использоватьНабор символов, поддерживающий отображаемый шрифт.кодирование иКодек использует тот же метод кодирования, вы можете решить искаженную проблему.
Далее перечислите классические сценарии и решения искаженных символов.
IntelliJ Idea искажает проблему
Китайская искаженная проблема в проекте IDE? Файл->Настройки->Редактор->Кодировки файлов, установите метод кодировки utf-8
IDE консоль китайская переврала? Попробуйте этот метод, откройте каталог установки IDE, найдите
Добавьте -Dfile.encoding=UTF-8 в конце текстаПроблема с искажением базы данных
Посмотреть кодировку базы данных:
show variables like 'character_set%'
Установите метод кодирования сеанса и глобальную область
//session 范围
set character_set_server=utf8;
set character_set_database=utf8;
//global 范围
set global character_set_database=utf8;
set global character_set_server=utf8;
Сессия, глобальная кодировка диапазона, перезапуск mysql могут изменить кодировку обратно, вы можете попробовать другой способ. Измените или добавьте следующее содержимое в файл конфигурации my.ini для mysql (среда Windows)
[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
[client]
default-character-set=utf8
Искаженная проблема угла кодирования
Китайские искаженные символы появляются при написании кода? Отследите и найдите место кодирования и декодирования и установите один и тот же метод кодирования.
Ссылка и спасибо
- Получить кодирование в принципе (1) - Первое понимание кодирования
- Решить проблему искаженных китайских символов в mysql?
Личный публичный аккаунт
- Если вы хороший ребенок, который любит учиться, вы можете подписаться на мой официальный аккаунт, чтобы учиться и обсуждать вместе.
- Если вы считаете, что в этой статье есть какие-либо неточности, вы можете прокомментировать или подписаться на мой официальный аккаунт, пообщаться со мной в частном порядке, и все смогут учиться и прогрессировать вместе.