Вопросы о размере текста
Сохранение текста в Unicode часто занимает больше места, чем сохранение его в устаревших
кодировках. Точное значение занятого пространства зависит от языка и конкретного текста. Пространство для некоторых распространенных кодировок может быть:
Кодирование шифром | Языки | UTF-8 | UTF-16 |
ASCII | Английский, Малайский, … | 0% | 100% |
ISO-8859-1 | Западноевропейские | 10% | 100% |
ISO-8859-7, обычный текст | Греческий | 90% | 100% |
ISO-8859-7, 50% разметка | Греческий | 45% | 100% |
TIS-620, обычный текст | Тайский | 190% | 100% |
TIS-620, 50% разметка | Тайский | 95% | 100% |
EUC-KR, обычный текст | Корейский | 50% | 5% |
EUC-KR, 50% разметка | Корейский | 25% | 55% |
На макроуровне это действительно не имеет большого значения. В настоящее время пропускная
способность и вместилище сети заняты видео, изображением и звуковыми файлами, а текст
потребляет только долю. Там может быть влияние на системы хранения данных,
которые сохраняют только текст. Если вас действительно волнует размер текста, то его можно уменьшить
используя сжатие.
Однако на микроуровне, увеличение размера вместилища имеет ряд
последствий:
- Алгоритмы, разработанные под допущения одного символа,
одного байта, больше не работают даже для Европейских языков (они никогда не
работали для Восточно-азиатских языков). Их нужно изменить, чтобы приспособить
многобайтовое отображение символов. Убедитесь, что вся обработка
всегда работает с полными символами. Полный символ может занять
от одного до четырех байт в кодировке UTF-8, и одну или две единицы 16-битного кода
в UTF-16. Для позиций символа, всегда используйте индекс
first byte (первого байта) или code unit(элемент кода) символа. - Обычно, спецификации любой длины нужно пересмотреть для того, чтобы
убедиться, что они будут базироваться на основе байтов, символов, UTF-16
code units (элемент кода), или глифов. Каждая основа имеет смысл в некоторых ситуациях, но
должно быть ясно, какая из них применяется. Использование основанного на символах определения
гарантирует достаточно места, но может занять больше места, чем необходимо,
так как каждый символ теперь требует 4 байта. Использование
основанного на байтах определения позволяет избежать такого размера, но может значительно ограничить
количество символов. Лучшими, конечно, есть схемы, которые выделяют
достаточно места для хранения данного текста. Другие приложения, управляющие пространством
(например, несколько “символов”, которые могут отображаться в поле формы)
могут не иметь возможности что-то сделать с несколькими логическими символами, а вместо этого
необходимо подсчитать количество единиц визуального текста (так называемые графемы). - Размер текста изменяется при каждом его преобразовании из одного
кодирования в другое. Нет фиксированных коэффициентов, применимых
для оценки размера необходимого вместилища, так что единственный способ узнать это –
действительности превратить текст. Необходимо соблюдать осторожность, чтобы избежать сокращения. Если
сокращение на самом деле необходимо, как и в некоторых отображаемых контекстах, особое внимание
надо обратить на сокращение границ символа или графемы.
Вопросы по шрифтам
При задании шрифтов веб сайты, использующие Unicode должны быть более осторожны
чем веб сайты, использующие устаревшие кодировки. Многие языки имеют уникальные или специфические
письменные традиции, даже если они разделяют скрипт с другими языками.
Например, Китайские и Японские системы письма имеют большое количество
символов, но имеют различные печатные традиции, так что Китайские
шрифты, как правило, не приемлемы для текста на Японском языке, и наоборот.
Например, есть тот самый символ, отображаемый при помощи Китайского и
Японского шрифта (вместе с HTML кодом, который используется для создания снимка
экрана):
Когда используются устаревшие кодировки браузеры часто угадывают язык с
кодирования и выбирают соответствующий шрифт.
Поскольку Unicode поддерживает как Китайский так и Японский языки, этот прием не работает
для страниц, закодированных в Unicode, а результатом может быть неуместный шрифт или
даже безобразное сочетание шрифтов, используемых для отображения контента.
Одно из решений – следить за языком, который используется, и
передать браузеру язык и шрифты, используемые для
языка. Для одноязычных страниц простой и эффективный подход – использование для языка
специальной таблицы стилей. Для многоязычных страниц, вы должны использовать
атрибут lang HTML тэгов для определения языка; несколько браузеров
используют эту информацию для выбора правильного шрифта.
Для точного
контроля над шрифтом вы также можете использовать классы для определения языка и
класс селекторов в таблице стилей, чтобы установить шрифт. CSS 2.1 селекторы
псевдо класса языка, которые будут выбирать непосредственно на основе атрибута(ов)
языка, не поддерживаются Internet Explorer и поэтому имеют ограниченную полезность.
Смотрите Результаты тестирования: Зависимый от языка стайлинг.
Восстановление кодировки
Тем не менее, нужно ее решать. Скрины любезно предоставленные одним из пользователей одного популярного форума. Их можно посмотреть без риска и экспериментов на собственной системе, «что будет если сменить кодировку». Все шрифты в этом списке выглядят совершенно нечитаемыми арабскими кракозябрами.
Несмотря на весь ужас ситуации, решение очень простое:
Измените язык с русского на английский в разделе “Язык и региональные стандарты” панели управления на вкладке “Дополнительно”, затем перезагрузите компьютер и сделайте изменения еще раз. Еще раз похвалите изысканные родные шрифты!
В windows 10 кодировка привязывается глобально к общему языку системы. Поэтому если у вас проблемы с отображением шрифтов, то нужно пройти: Пуск -> Параметры -> Время и Язык -> Регион и язык -> Дополнительные настройки даты и времени, региональные параметры -> и посмотреть настройки в пунктах: Язык и Региональные стандарты .
Одна из проблем, с которой можно столкнуться после установки Windows 10 – кракозябры вместо русских букв в интерфейсе программ. Чаще ошибка встречается в англоязычных и не совсем лицензионных версиях системы.
В этом руководстве описаны различные способы исправления “кракоглифов” (также известных как иероглифы) в Windows 10. Для тех, кто использует русский язык в Windows 10, это может быть полезно.
Выбрать кодировку для
внутреннего использования
Unicode предлагает три формы кодирования: UTF-8, UTF-16, та UTF-32.
Обычно для перемещения по сети или для сохранения в файлах UTF-8 работает
лучше потому, что оно совместимо с ASCII, тогда как похожие на ASCII байты, которые
содержатся в UTF-16 и UTF-32 тексте – это проблема для некоторых сетевых
устройств или инструментов обработки файлов.
Для обработки в памяти, все три
формы кодирования могут быть полезными, и лучший выбор часто зависит от
программных платформ и библиотек, которые вы используете: Java, JavaScript, ICU, и большинство
Windows APIs (прикладные программные интерфейсы) базируются на основе UTF-16, в то время как Unix системы, как правило, предпочитают UTF-8.
Размер хранящихся данных редко становится фактором при принятии решения между UTF-8 и UTF-16, поскольку
оба могут иметь лучший размер профиля, в зависимости от сочетания разметки и
Европейских или Азиатских языков. UTF-32 является неэффективным для хранения и, следовательно,
редко используется с этой целью, но оно очень удобно для обработки, и
некоторые библиотеки, такие как Java и ICU, обеспечили строку доступа и обработки
API (прикладные программные интерфейсы) с точки зрения UTF-32 code points (точка кода).
С уверенностью можно сказать, что сохранение текста, кодирование которого не известно есть
исключением из единого правила Unicode. Такой текст часто нужно интерпретировать
используя технологию распознавания кодировки символов. И обнаружения кодирования символов не
надежный процесс.
Действия в условиях
неопределенности
Как упоминалось ранее, иногда случается, что базы данных содержат текст
кодирование которого не известно. Выявление кодировки можно использовать
для получения представления о кодировании, но этот процесс не является надежным. Чтобы справиться с
неопределенностью, необходимо выполнить ряд дополнительных шагов:
- Выполнить попытку для оценки точности определения кодировки. Используйте
алгоритм обнаружения, который вы собираетесь использовать на подмножество данных,
преобразуйте данные из обнаруженного кодирования в Unicode, и для проверки результатов
нужны люди, которые знакомы с языками, которые использовались. Если точность
не соответствует требованиям, попробуйте другие алгоритмы определения кодировки или
используйте дополнительную информацию, которая доступна для вашей программы. - Если ваши данные содержат информацию связанную с кодированием (но вы
не полностью ей доверяете), сосредоточьте внимание на случаях, когда алгоритм обнаружения
распознает различные кодировки. Это может помочь вам сосредоточиться на необходимых
улучшениях в использовании дополнительной информации. - После переноса обеспечьте способы для позднего исправления кодировки.
Одно из решений заключается в обеспечении пользовательского интерфейса, который позволяет пользователю
указывать фактическое кодирование, которое затем сохраняется с текстом и используется
для преобразования текста. Для этого вам нужно сохранить доступными оригинальные
последовательности байтов, наряду с именем обнаруженного кодирования.
Независимо от того, сохранение версии текста в Unicode определяется тем, насколько часто
текст доступен – для текста, к которому обращаются часто, возможно нужно будет
caching (кэшировать) Unicode версию, а для другого текста возможно
лучше сохранить вместилище и регенерировать Unicode версию
когда это необходимо.
Для простоты, следующие разделы предусматривают, что кодирование может быть
точно определено и, следовательно, преобразование является одноразовым мероприятием. Там где
это не так, стратегии должны быть скорректированы.
Локализация отладочной консоли visual studio
Отладочная консоль является наиболее широко используемой, наиболее практичной и простой в использовании.
Приложение не обязательно должно быть локализовано в консоли. В отношении этого Microsoft говорит четко: “Программы, которые вы запускаете после назначенной кодовой страницы, используют новую кодовую страницу. “Помимо прочего, некоторые программные продукты (включая Cmd.exe), которые вы запустили после назначения новой кодовой страницы, возобновят свою работу”.
Таким образом, вы можете локализовать консоль когда угодно и как угодно. Теперь встает вопрос о том, когда будет полностью установлена связь между консолью и приложением.
Важно: При запуске оператора вывода приложение окончательно стабилизирует связь с консолью.
В приведенном ниже примере приложения в консоль показан вывод изложенного. Вводный поток состоит из номеров текущих страниц, устанавливает новые кодовые страницы вводного потока и вывода. Очередность операций повторяется несколько раз для всех основных кодовых страниц, упомянутых ранее.
F:LoggingConsole.TestbinReleasenet5.0>chcp
Active code page: 1251
F:LoggingConsole.TestbinReleasenet5.0>loggingconsole.test
Codepages: current 1251:1251, setted 437:437, ΓΓεΣΦ∞ 5 ±Φ∞ΓεδεΓ ∩ε-≡≤±±ΩΦ: Θ÷≤Ωσ=Θ÷≤Ωσ
Codepages: current 437:437, setted 65001:65001, 5 -: =
Codepages: current 65001:65001, setted 1252:1252, ââîäèì 5 ñèìâîëîâ ïî-ðóññêè: éöóêå=éöóêå
Codepages: current 1252:1252, setted 1251:1251, вводим 5 символов по-русски: йцуке=йцуке
Codepages: current 1251:1251, setted 866:866, ттюфшь 5 ёшьтюыют яю-Ёєёёъш: щЎєъх=щЎєъх
Codepages: current 866:866, setted 1251:1251, вводим 5 символов по-русски: йцуке=йцуке
Codepages: current 1251:1251, setted 1252:1252, ââîäèì 5 ñèìâîëîâ ïî-ðóññêè: éöóêå=éöóêå
F:LoggingConsole.TestbinReleasenet5.0>chcp
Active code page: 1252
Код тестового приложения под катом
Единственный способ обеспечить максимальную совместимость приложений в масштабах всей системы – это программный контроль кодировок консоли. В languages. Net такой возможности нет, но есть функции WinAPI, такие как SetConsoleCP и SeeMapOutputP, где numcp – номер кодовой страницы входного и выходного потоков, соответственно.
Совет 7. Обязательный и повторяющийся. Код должен содержать SetConsoleCP перед первым оператором вывода.
Нормализация
В Unicode некоторые символы можно представить более чем одним способом.
Unicode определяет несколько путей устранения этих различий, когда они
не имеют значения для обработки текста. Дополнительные сведения о нормализации, смотрите CharMod-Norm.
Unicode не предписывает, когда использовать конкретную форму Unicode
нормализации. Тем не менее, целый ряд процессов, работает лучше, если текст нормирован, в
отдельных процессах, которые содержат в себе сравнения текста, таких как сортировка, поиск и
обработка regular expression (регулярное выражение).
Некоторые библиотеки выполняя эти процессы
предлагают нормализацию в качестве части процесса, в противном случае, прежде чем использовать
эти процессы вы должны убедиться, что текст нормирован. Как правило, нормализационная
форма C (NFC) рекомендована для веб-приложений.
Некоторые языки требуют нормализации перед обработкой, поскольку
различные методы ввода могут генерировать различные последовательности codepoints (точка кода)
Unicode. Вьетнамская язык является ярким примером, где вьетнамская раскладка клавиатуры
начиная с Windows 2000 и выше производит последовательности символов, которые отличаются от, тех
что производят большинство Вьетнамского программного обеспечения для ввода данных. Аналогичные вопросы возникают
в ряде Африканских языков, первая, которая приходит в голову –
Йоруба.
Определение кодировки
символов
Всякий раз, когда последовательность байтов интерпретируется как текст и обрабатывается, ее
кодирование должен быть известным. Во многих случаях определение кодировки
символов настолько тривиальное, что об этом даже не задумываются – например, когда
обрабатывается строка в языке программирования, который указывает, что строки
закодованни в UTF-16.
Однако в других случаях, нет четкой спецификации
доступно ли кодирование или текст, приходит от источника, которому нельзя
полностью доверять, чтобы обеспечить правильную спецификацию. В таких случаях
более сложный процесс, требует определения кодировки символов и
позднее нужно включить исправление допущенных ошибок:
- Интерпретировать любые доступные спецификации кодирования. Если
спецификация доступна и ей можно доверять, то все готово. - Если спецификация кодирования символов доступна, но ей
полностью нельзя доверять, то проверьте ее. Проверка доступна для кодировок,
которые накладывают ограничения на действительные последовательности байтов, такие как UTF-8, EUC-KR,
ISO 2022-JP. Если текст превращен в другую кодировку для
внутренней отделки, проверка часто является просто побочным эффектом
преобразования, но если преобразование не требуется, то необходимо сделать
проверку. Если последовательность байтов недопустима для указанного кодирования вам
необходимо отказаться от входной информации и связаться с провайдером, чтобы он предоставил правильную входную информацию (в
случае XML, отказ необходим согласно спецификации). Тем не менее, в
случаях, когда у вас нет контроля над данными, переходите к следующему
шагу. - Если спецификация кодирования символов не доступна, или
не удалось провести проверку используйте выявление кодировки для определения вероятного
кодирования. - Если кодирование было определено путем выявления
(а не по спецификации и проверке), то держите неподалеку оригинальную
последовательность байтов, для того чтобы позже можно было снова превратить его
на другое кодирование символов. Обеспечьте механизм пользовательского интерфейса, который позволяет пользователям
переопределить заданное или обнаруженое кодирование и повторить
преобразования. Сохраните вместе с последовательностью байтов кодировки символов, которое чаще всего
используются для последовательности байтов, особенно, если это было выбором
пользователя, это поможет избежать ненужной переработки всех вышеупомянутых шагов.
Перенос данных
Преобразование данных, связанных с продуктом, во многих случаях может быть
самой большой проблемой в переходе продукта в Unicode. Например, некоторые
программы владеют или имеют доступ к ряду баз данных, некоторые из которых управляются
такими движками баз данных как Oracle или MySQL.
При переносе данных в Unicode хорошо бы объединить
базы данных, которые были раньше отдельными через различные
кодировки. Использование единой базы данных по всему миру или только нескольких для
основных регионов может упростить развертывание и обслуживание, и может позволить
обмен контентом между различными рынками, и Unicode идеально подходит для этого поскольку он
может представлять текст на всех языках.
Однако при объединении вы должны иметь в виду,
что другие ограничения связаные с распределением контента могут оставаться:
доступность языка, условия лицензирования, а также юридические или культурные
ограничения на публикацию материалов, связанных с политикой, религией, полом и
насилием.
Стратегии для преобразования данных будут изменяться в зависимости от ряда
факторов:
- Все ли данные в базе данных используют то же самое кодирование, или разные
кодирования. - Известно кодирования данных или нет.
- Зависит ли от знаний о кодировке доступ к данным или
другие функции, реализованные в базе данных, или нет. Например,
индексы на текстовых полях в целом зависят от кодировки символов и
языка, в то время как индексы на числовых полях не зависят. - Размер данных.
- Репликация данных.
- Uptime (безотказная работа) требования.
Через вариации в этих факторах не существует простого рецепта, которого
необходимо соблюдать при преобразовании базы данных продукта. Ниже
обсуждение общих соображений; однако, как правило, необходимо
создать план конверсии с учетом для каждого продукта.
Решение вопросов относительно
размера текста
Как уже упоминалось в Вопросы относительно Размера Текста (выше),
преобразование текста в Unicode, как правило, происходит за требований расширенного
вместилища, и вы должны тщательно рассмотреть вопрос о целесообразности измерения
длины текста в байтах, символах или UTF-16 code units (элементы кода). Чтобы уменьшить влияние
увеличенных размеров поля переключите CHAR поля в базах данных SQL
на VARCHAR, что позволит базе данных выделить столько
пространства сколько необходимо.
При измерении текста, некоторые базы данных не дают вам выбора. Например,
MySQL всегда измеряет с точки зрения Unicode BMP символов, в результате чего получается 3
байта на символ. Другие, такие как Oracle, позволяют выбирать между семантикой символа
или байта. Другие системы хранения данных, которые накладывают ограничения на размер скорее всего
измеряют в байтах.
При переносе, которое включает в себя перекодировку, будьте осторожны, чтобы
избежать сокращения. В некоторых случаях, к сожалению, вы не сможете это сделать,
через такие внешние ограничения, как 30 байтный лимит в Oracle для
схемы имен объектов в словарях данных (использование символов ASCII для схемы
имен помогает избежать этой проблемы). В таких случаях, по крайней мере убедитесь, в сокращении
в пределах символа.
Также имейте в виду, что перевод может быть увеличен за свой счет. Посмотрите перевод, чтобы увидеть, насколько велик текст.
Понимание текущего использования
кодировок символов
Для начала, вы должны хорошо понимать как кодировка символов используются
в вашем программном обеспечении. Определить компоненты
программы и вместилища данных: передняя часть, задняя часть, вместилище, APIs(прикладные программные интерфейсы), веб
интерфейсы, и т.д., и выяснить их использование в кодировках:
- Какие компоненты уже основаные на Unicode? Какая кодировка Unicode
используется (UTF-8 или UTF-16)? Какие компоненты используют устаревшие(т.е. отличные
от Unicode) кодировки? - Какие потоки данных между компонентами, и какие кодировки
используются в каждом случае? - Какие кодировки определены для интерфейсов между
компонентами? - Какие кодировки, определенные для внешних интерфейсов
программного обеспечения? - Где происходит перекодировка?
- Четко ли разделены единицы текста, которые используют различные кодировки,
или кодирования указанные в каждой точке, или существуют возможности
для сохранения или обработки текста в разных или неизвестных кодировках?
Последний вопрос может показаться странным, но он особенно важен. Отсутствие
достоверной информации о кодировке символов, которая используется для текста,
поступающего извне сайта (такого, как каналы контента или данные введенные пользователем) или,
или, то, что уже в ваших коллекциях данных является общей проблемой и требует
особого внимания.
Преобразование баз данных sql
База данных SQL на самом деле состоит из двух компонентов: компонент сервера,
который фактически управляет данными, а также клиентский компонент, который взаимодействует
с другими приложениями (например, PHP или Java runtime) и взаимодействует с
компонентами сервера.
В зависимости от размера базы данных и ее требований к безотказной работе, доступные
различные стратегии для преобразования:
- Дамп и перезагрузка: содержимое базы данных сбрасывается в текстовый
файл, превращается в желаемое кодирование Unicode, и загружается в новую
базу даних. Эта стратегия проста, но работает только для баз данных, которые можно
перевести в автономный режим на длительный период, необходимый для преобразования. - Создать новую базу данных Unicode: создается новая база данных, использующая
кодировку Unicode и поверх копируется контент из старой базы данных и с ходу
делается преобразование. Транзакции, которые обновляют или удаляют контент, который уже
скопирован должны быть отражены в новой базе данных. Когда новая
база данных настигает старую, доступ переключается для новой
базы данных. Как правило, это лучшая стратегия для производства баз данных,
но она требует доступности достаточного количества серверного оборудования баз данных для запуска
двух баз данных в параллельном режиме. - Добавить Unicode столбцы: В этой модели, каждый текстовый столбец в
устаревшей кодировке спаренный с новым столбцом в Unicode кодировке. Поля
в этого столбика заняты, а потом еще и меняются запросы для доступа к
Unicode столбику вместо столбика устаревшего кодирования. Если устаревшее
кодирование точно известно, то столбик устаревшего кодирования можно
удалить. Эта стратегия может понадобиться, если на диске не хватает места для создания
абсолютно новой базы данных и, если код доступа к
базе данных приемлемо мал. - Преобразования на месте: Некоторые базы данных, такие как MySQL, имеют
возможность на месте превратить таблицу с одной кодировки в другую. Это
работает только для баз данных, которые можно перевести в автономный режим на период, необходимый
для преобразования. - Преобразование в месте с тэгом кодирования: Если база данных только
управляет байтами, и все интерпретации байт как текста делаются
за пределами базы данных, то можно делать преобразования на месте и
отслеживать прогресс используя тэг кодирования на каждой записи. Процессы, которые
имеют доступ к базе данных должны быть проинформированы о тэге кодирования и превращать
байты, которые они хранят в базе данных или извлекать из базы данных с их и в их
собственные кодировки. Если база данных содержит только одно устаревшее кодирование,
BOM можно использовать, чтобы отличить Unicode строки.
Язык и документация SQL имеют дурную привычку использовать
термин “character set” (набор символов) для кодировок символов, игнорируя тот, факт, что UTF-8
и UTF-16 (и даже GB18030) являются разными кодировками одного и того же набора
символов.
Кодирование символов избранное для базы данных Oracle устанавливается для
всей базы данных, включая данные, схемы и запросы, с одним исключением: NCHAR и NVARCHAR типы
всегда используют Unicode.
Для базы данных предлагаются различные Unicode кодирования,
как для целой базы так и для таких типов данных как NCHAR и NVARCHAR. Для базы данных правильными являются
UTF-8 под названием AL32UTF8, и вариант UTF8, кодирующий дополнительные символы в виде двух 3-байтных
последовательностей.
Для перехода баз данных в Unicode, вы должны использовать AL32UTF8(базы данных, которые уже используют UTF8 в большинстве случаев могут продолжают это делать – разница
между этими кодировками может повлиять на параметры сортировки и индексации в
базе данных, но в целом это не имеет большого значения, так как клиентский интерфейс
превращает UTF8 чтобы исправить UTF-8).
Для таких типов данных, как NCHAR и NVARCHAR UTF-16 доступен под названием AL32UTF8, рядом
с вариантом кодирования UTF8.
Семантику
спецификаций длины для таких типов данных, как CHAR, VARCHAR2, и LONG можно
установить используя NLS_LENGTH_SEMANTICS, с
байтовой семантикой по умолчанию, в то время, как типы данных NCHAR и NVARCHAR всегда используют символьную семантику.
Для правильного преобразования между кодированием (ямы), что используется в пределах базы данных в
кодировке клиента очень важно определить NLS_LANG переменную среду на стороне клиента. Эта
переменная описывает язык, территорию, и кодирования, что используется клиентской
операционной системой.
Oracle имеет множество других параметров, чтобы указать в базе данных чувствительное к
локали поведение; они вообще могут быть установлены отдельно от кодировки
до тех пор пока кодирование может представлять символы выбранной локали.
Unicode поддерживает все языковые стандарты (локали).
Oracle обеспечивает встроенную поддержку для нескольких стратегий преобразования.
Инструмент Character Set Scanner помогает в выявлении возможного преобразования и
сокращении проблем в анализе предварительного преобразования. Утилиты экспорта и импорта
помогают в выполнении дампа и перезагрузке стратегии.
Добавлять Unicode
столбики легко, так как NCHAR и NVARCHAR типы данных поддерживают Unicode независимо от
кодировки базы данных. Преобразования на месте с тэгом кодирования возможно, если
сама база данных не растолкует текст – ALTER
DATABASE CHARSET заявление может быть использовано для того, чтобы информировать базу данных о
фактическом кодировании когда преобразование будет завершено.
Есть сообщения, что NCHAR типы данных не
поддерживаются в PHP Oracle Call Interface.
Кодированием по умолчанию в MySQL есть latin1, а именно, ISO-8859-1. Unicode кодирования,
которые поддерживаются называются utf8 и ucs2.
Обычно рекомендованным
кодированием для MySQL должно быть utf8. Оба utf8 и ucs2 ограничены для
символов Unicode Basic Multilingual Plane (BMP), так что нет
никакой поддержки для дополнительных символов в MySQL.
В результате utf8 не является
полностью совместимой реализацией UTF-8 (хотя для большинства случаев это
нормально). Такие типы данных, как NCHAR и NVARCHAR всегда используют utf8.
Спецификации длины для символьных типов данных
интерпретированы в Unicode BMP символы, так спецификация CHAR(5) CHARACTER SET utf8 зарезервирует 15 байт. Такие meta данные
как имена пользователей, всегда хранятся в UTF-8, поэтому нелатинские названия можно
использовать.
Кодирования символов для клиентского
подключения можно установить отдельно для клиента, подключения, и результатов, но, чтобы
избежать путаницы, лучше установить их все вместе, используя SETВ NAMESВ ‘utf8’. Кодирование ucs2 не
поддерживается для клиентских подключений, так что нет никаких оснований использовать это
кодирование для контента базы данных.
Сортировки, связанные с кодировками символов, поэтому они
всегда должны устанавливаться в то же время, что и кодирование. Если utf8 используется без указания о сортировке, то по умолчанию используется такая сортировка, как utf8_general_ci.
Это устаревший алгоритм
сортировки, что не является хорошим для любого конкретного языка. Сортировка utf8_unicode_ci лучшая по умолчанию, так как она реализует
Unicode Collation Algorithm (UCA) и работает для многих языков, специально
не поддерживается названной сортировкой.
Вы также можете выбрать одну из
language-named UTF-8 сортировок, чтобы получить language-specific сортировку
“строго” основанную на UCA. Смотрите список сортировок для Unicode
Character Sets. MySQL поддерживает функцию
CONVERT, которая позволяет преобразовывать результаты запроса из одного
кодирования в другое.
Преобразование кодировки символов
Когда предполагается, что текст будет в одной кодировке символов, а после него будет другая кодировка, всегда требуется перекодировка. Кодировка символов преобразуется с помощью ICU и iconv, хотя некоторые платформы предлагают свои собственные библиотеки преобразования.
При их использовании крайне важно использовать соответствующие имена кодировок для каждой отдельной библиотеки. Для получения дополнительной информации обратитесь к разделу “Кодировки символов”.
Есть некоторые конкретные вопросы преобразования, которые могут повлиять на определенные
продукты:
- Альтернативные отображения некоторых символов: в некоторых Восточно-азиатских
кодировках, некоторые символов имеют несколько толкований. Например,
значение 0x5C в Shift-JIS может быть истолковано в именах файлов как “”, но
в финансовых данных как “¥”. При отображении Unicode, должно быть принято
решение отражать или U 005C “” или U 00A5 “¥”. Общий подход –
отображать U 005C, работающий в файловой системе и который много Японских
шрифтов будут отображать как “¥”. Однако, если поведение вашей программы
зависит от отображения (например, она анализирует значение валюты), вы имеете
принять необходимые меры, чтобы контролировать результат. В случае примера,
вы могли бы перед превращением отобразить 0x5C как код валюты “JPY” и
затем, после преобразования “JPY” как U 00A5. Символы частного использования: Несколько
кодировок, включая Unicode и большинство кодировок Восточной Азии,
имеют диапазоны code point (точка кода), которые зарезервированы для частного использования или просто
не определены. Они часто используются для символов конкретного или частного
использования — emoji установленая Японскими операторами мобильной связи является примером. Стандартные преобразователи
символов не знают как отобразить такие символы. Для приложений, где
поддержка символов частного использования является критической, чтобы обеспечить правильное отображение вам лучше
использовать обычные преобразователи символов или использовать обходные пути, такие как numeric character
references (числовые ссылки).Версии кодировок символов и
отображений: Много кодировок символов менялись с течением времени, и поэтому
сопоставьте их. Примером может служить отображение с HKSCS в Unicode: Ранние
версии HKSCS имели отображать числовые символы в области частного использования Unicode,
ибо Unicode не поддерживал их, но позже эти
символы добавили в набор символов Unicode, и
отображение с HKSCS были изменены, чтобы отобразить новые добавленые символы.
Вообще, вы должны убедиться, что вы используете последние версии
преобразователей символов.
Проблемы консолей visual studio
Командная строка разработчика и Windows PowerShell подключаются по умолчанию при подключении консолей к Visual Studio. Одним из преимуществ является то, что вы можете устанавливать собственные параметры консоли отдельно от общесистемных.
Команда запуска приложения принимается и передается под контроль односессионной отладочной консоли в Visual Studio. На протяжении всего рабочего сеанса отладочная консоль управляется приложением; ни команды Windows, ни сама система не присутствуют.
Совет 6. При тестировании приложения на внешних консолях предпочтительнее использовать среды, более благоприятные для локализации.
Анализ проблем консолей не был бы полным без ответа на вопрос – можно ли запустить приложение в приложении, если у него нет консольной оболочки Можно открыть любой файл “.exe” двойным кликом, и окно приложения откроется. Однако однопоточное приложение, по крайней мере двухпоточное — не поддержит консольный режим и оно завершится.
Решение вопросов относительно
размера текста
Как уже упоминалось в Вопросы относительно Размера Текста (выше),
преобразование текста в Unicode, как правило, происходит за требований расширенного
вместилища, и вы должны тщательно рассмотреть вопрос о целесообразности измерения
длины текста в байтах, символах или UTF-16 code units (элементы кода).
При измерении текста, некоторые базы данных не дают вам выбора. Например,
MySQL всегда измеряет с точки зрения Unicode BMP символов, в результате чего получается 3
байта на символ. Другие, такие как Oracle, позволяют выбирать между семантикой символа
или байта. Другие системы хранения данных, которые накладывают ограничения на размер скорее всего
измеряют в байтах.
При переносе, которое включает в себя перекодировку, будьте осторожны, чтобы
избежать сокращения. В некоторых случаях, к сожалению, вы не сможете это сделать,
через такие внешние ограничения, как 30 байтный лимит в Oracle для
схемы имен объектов в словарях данных (использование символов ASCII для схемы
имен помогает избежать этой проблемы). В таких случаях, по крайней мере убедитесь, в сокращении
в пределах символа.
Кроме того: обратите внимание, что может быть расширение текста за счет перевода. Смотрите Размер текста в переводе.
Способ 2: изменение кодировки через системный реестр
Второй метод исправления ошибок с чтением кодировки заключается в ручном выборе требуемых таблиц из системного реестра.
Первый вариант
Перейти к
Следующий шаг – длительный процесс: каждый ключ в этой директории нужно заменить на CP_1251.
Альтернативный вариант
Выберите в окне следующий текст:
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNlsCodePage]
“1250”=”c_1250.nls”
“1251”=”c_1251.nls”
“1252”=”c_1252.nls”
“1253”=”c_1253.nls”
“1254”=”c_1254.nls”
“1255”=”c_1255.nls” [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionFontMapper]
“ARIAL”=dword:00000000 [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionFontSubstitutes]
“Arial,0″=”Arial,204”
“Comic Sans MS,0″=”Comic Sans MS,204”
“Courier,0″=”Courier New,204”
“Courier,204″=”Courier New,204”
“MS Sans Serif,0″=”MS Sans Serif,204”
“Tahoma,0″=”Tahoma,204”
“Times New Roman,0″=”Times New Roman,204”
“Verdana,0″=”Verdana,204”
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNlsCodePage
Внимание! Обязательно после последней строчки введите пустую строку!
По завершении процедуры нажмите “Сохранить”.
Закрывайте «Блокнот» и переходите к директории, в которую сохранили файл. Обратите внимание, что теперь его иконка имеет вид файла реестра. На этом этапе рекомендуем сделать резервную копию данных — откройте «Редактор реестра» и воспользуйтесь пунктами «Файл» — «Экспорт».
Подтвердите, что хотите внести изменения.
В большинстве случаев вышеуказанных действий достаточно для устранения всех проблем с кракозябрами, но стоит иметь в виду, что они могут привести к другим неполадкам, поэтому применять его рекомендуем исключительно в крайнем случае.