Как определить/объявить кодовые точки utf-8 для турецких специальных символов (не ascii), чтобы использовать их в качестве стандартной кодировки utf-8?

Тюркские символы "ÇçĞğııÖöŞşÜü" не обрабатываются правильно в кодировке utf-8, хотя все они кажутся определенными. Символы всех из них - 65533 (символ replacemnt, возможно, для отображения ошибок) при использовании, и в зависимости от выбранного шрифта отображается вопросительный знак или поле. В некоторых случаях 0/null возвращается как charcode. В Интернете есть много инструментов, которые дают определения utf-8, но я не уверен, что инструменты используют какой-либо определенный (реальный/международный) реестр или динамически создают определение с известными правилами и вычислениями. Шрифты для них четко определены, и нет проблем с отображением их при вводе кодовых точек вручную. Это доказывает, что они определены в utf-8. Но, с другой стороны, они не обрабатываются в кодировках или траннаформациях, таких как ajax-запросы/ответы.

Итак, базовый вопрос: "КАК МЫ ОПРЕДЕЛИЕМ КОДЕКСА ДЛЯ A CHAR"? Вопрос может быть адаптирован следующим образом для предотвращения ошибочной концепции. Предположим, что мы подготовили данные кодирования для "Ç" следующим образом: Характер: Ç Название персонажа: LATIN CAPITAL ПИСЬМО C CEDILLA Кодовая точка шестнадцатеричного кода: 00C7 Десятичный код: 199 Ширина Hex UTF-8: C387 ...... Где/Как мы можем сохранить эту информацию в качестве стандартного utf-8 char? Как мы можем распространять/раскрывать его (готовиться к использованию другими)? Нужно ли нам какое-либо подтверждение кем-либо/учредителем (например, консорциум unicode/utf-8) Как мы можем обнаружить/исправить ошибки, если они уже зарегистрированы, но не работают правильно? Можем ли мы иметь конфигурацию custom-utf8? Если да, то как?

Примечание. Здесь нет фрагмента кода, так как это не проблема с неправильным использованием.

Ответ 1

Обозначенные вами символы присутствуют в Unicode. Вот их коды символов в шестнадцатеричном формате и как они кодируются в UTF-8:

      Ç     ç     Ğ     ğ     İ     ı     Ö     ö     Ş     ş     Ü     ü
Code: 00c7  00e7  011e  011f  0130  0131  00d6  00f6  015e  015f  00dc  00fc
UTF8: c3 87 c3 a7 c4 9e c4 9f c4 b0 c4 b1 c3 96 c3 b6 c5 9e c5 9f c3 9c c3 bc

Это означает, что если вы пишете, например, байты 0xc4 0x9e в файл, вы написали символ Ğ, а любой программный инструмент, который понимает UTF-8 , должен читать это как Ğ.

Обновление:. Для правильного преобразования алфавитного порядка и кода на турецком языке вы должны использовать библиотеку, которая понимает локали, как и для любого другого естественного языка. Например, в Java:

Locale tr = new Locale("TR","tr");     //    Turkish locale
print("ÇçĞğİıÖöŞşÜü".toUpperCase(tr)); //    ÇÇĞĞİIÖÖŞŞÜÜ
print("ÇçĞğİıÖöŞşÜü".toLowerCase(tr)); //    ççğğiıööşşüü

Обратите внимание, что я в верхнем регистре становится İ, а я в нижнем регистре становится ı. Вы не говорите, какой язык программирования вы используете, но, конечно же, его стандартная библиотека также поддерживает локали.

Unicode определяет кодовые точки и определенные свойства для каждого символа (например, если это цифра или буква, для буквы, если она имеет верхний регистр, строчный регистр или заголовок) и некоторые общие алгоритмы для обработки текста Unicode (например, как смешивать текст справа налево и текст слева направо). Алфавитный порядок и правильное преобразование случаев определяются национальными органами стандартизации, такими как Институт языков Финляндии в Финляндии, Real Academia Española в Испании, независимо от Unicode.

Обновление 2:

Тест ((ch&0x20)==ch) для нижнего регистра нарушен для большинства языков в мире, а не только для турецких. Так же и алгоритм преобразования верхнего регистра в нижний регистр, о котором вы упоминаете. Кроме того, тест на письмо является неправильным: на многих языках Z не является последней буквой алфавита. Чтобы правильно работать с текстом, вы должны использовать библиотечные функции, написанные людьми, которые знают, что они делают.

Unicode должен быть универсальным. Создание национальных и языковых вариантов кодировок - вот что привело нас к беспорядку, который пытается решить Unicode. К сожалению, нет универсального стандарта для заказа символов. Например, на английском языке a = ä < z, но на шведском языке < z < ä. В немецком языке U эквивалентен U одним стандартом, а UE - другим. В финском языке Ü = Y. Невозможно заказать кодовые точки, чтобы порядок был правильным на каждом языке.