Перекодировать текст из Windows-1258 ↓
Вьетнамский язык пишется латиницей, но так густо украшенной диакритическими знаками, как ни один другой язык мира. Вьетнамский алфавит содержит буквы с крышечками, крючками и рожками, а кроме того, над или под каждой гласной ставится один из знаков тона. В результате одна и та же гласная может выглядеть десятками способов. Буква "a", например, бывает "à", "á", "ả", "ã", "ạ", "ă", "ằ", "â", "ầ" и так далее. Уместить всё это в 256 позиций было непростой задачей.
Кодовая страница 1258, созданная Microsoft для вьетнамского языка, решает её хитрым способом. Вместо того чтобы отводить отдельную позицию каждой готовой букве со всеми знаками, она хранит часть букв в виде сочетаний. Основные буквы с крышечкой или рожком, например "â", "ê", "ô", "ơ", "ư" и "ă", занимают отдельные позиции, а знаки тона записываются отдельными символами, которые ставятся после буквы и накладываются на неё при отображении.
Такой подход называется комбинированием. Например, буква "ệ" в Windows-1258 хранится как "ê" и отдельный знак точки снизу. На экране они сливаются в один символ, но в файле занимают два байта. Это позволило уместить весь вьетнамский алфавит в одну таблицу, но усложнило обработку текста: подсчёт количества букв, поиск и сортировка требуют знания о том, что некоторые символы на самом деле являются частью соседних букв.
Windows-1258 была не единственной вьетнамской кодировкой. Во Вьетнаме существовал национальный стандарт TCVN 5712 и популярная кодировка VISCII, в которой все готовые буквы с тонами занимали отдельные позиции, в том числе в диапазоне управляющих кодов. Каждая из этих кодировок имела своих сторонников, и тексты, созданные в разных программах, были несовместимы между собой.
С приходом Юникода ситуация не упростилась сразу. Вьетнамский текст в Юникоде можно записать двумя способами: готовыми буквами со всеми знаками или сочетаниями базовых букв и отдельных знаков. Оба способа выглядят на экране одинаково, но с точки зрения компьютера это разные строки. Поэтому для поиска и сравнения вьетнамского текста используется нормализация, приведение к единому виду. Программы конвертации из Windows-1258 также должны учитывать, что результат может содержать отдельные знаки, а не готовые буквы.
Ошибки при чтении вьетнамского текста в другой кодировке выглядят особенно неприятно. Если текст в UTF-8 прочитать как Windows-1252, каждая буква с диакритикой превращается в набор из двух или трёх символов, и название страны "Việt Nam" становится "Việt Nam". Такие следы часто встречаются на старых вьетнамских сайтах и в базах данных, перенесённых между системами.
Сегодня вьетнамские сайты работают в UTF-8, но Windows-1258 встречается в старых документах и программах. Если вьетнамский текст отображается с отдельными знаками рядом с буквами или вместо букв стоят странные последовательности символов, укажите Windows-1258 исходной кодировкой и преобразуйте текст в UTF-8.