Go Unicode объединяет символы (кластеры графем) и консоль MS Windows cmd.exe - PullRequest
0 голосов
/ 24 августа 2018

В следующем коде - это не один символ Unicode U + 00FC, а отдельный кластер графем, состоящий из двух символов Unicode, простого ASCII u U + 0075, за которым следует комбинированный диарез U + 0308.

fmt.Println("Jürgen Džemal")
fmt.Println("Ju\u0308rgen \u01c5emel")

Если я запускаю его на игровой площадке , он работает как положено.

Если я запускаю его в окне «Командная строка» MS Windows 10, он визуально не объединяет объединяющий символ с предыдущим.Однако, когда я вырезал и вставил текст сюда, он выглядит правильно:

C:\> ver

Microsoft Windows [Version 10.0.17134.228]

C:\> test
Jürgen Džemal
Jürgen Džemel

На экране в окне «Командная строка» это выглядело примерно так:

Ju¨rgen Džemel

Изменение кодастраница (chcp) с 850 по 65001 не имеет значения.Изменение шрифтов (Consolas, Courier и т. Д.) Не имело значения.

В прошлом у меня возникали проблемы, которые были принципиально связаны с тем, что Microsoft требовала, чтобы программы Windows использовали другой API для вывода символов в STDOUT в зависимости от того, подключен ли STDOUT кконсоль или в файл.Я не знаю, является ли это другим проявлением той же проблемы.

Есть ли что-то, что я могу сделать, чтобы этот графемный кластер Unicode выглядел правильно?

1 Ответ

0 голосов
/ 24 августа 2018

Как прокомментировали eryksun и Peter ,

  • Консоль Windows (conhost.exe) не поддерживает комбинирование кодов.Вы должны сначала нормализовать эквивалентную строку, которая использует предварительно составленные символы.
  • вы можете использовать golang.org/x/text/unicode/norm для нормализации (например, norm.NFC.String("Jürgen Džemal"))

Я пробовал это

s := "Ju\u0308rgen \u01c5emel"
fmt.Println(s)              // dieresis not combined with u by conhost.exe
s = norm.NFC.String(s)
fmt.Println(s)              // shows correctly

И вывод был похож на это

Ju¨rgen Džemel \n Jürgen Džemel

или, для слабовидящих с невероятно сложными программами чтения с экрана - примерно так:

Ju¨rgen Džemel
Jürgen Džemel

Обратите внимание, что Unicode имеетчетыре различных нормализованных формы, но NFC наиболее часто используется в Интернете на веб-страницах и также подходит для этой ситуации.

В этом пакете есть и другие методы, которые могут быть более эффективными или более полезными

Я читал, что используются визуальные символы, которые могут быть представлены только в Юникоде с использованием комбинированных символов.Другими словами, для которых нет заранее составленного символа.Необходим более тщательный подход, чтобы сделать что-то соответствующее с ними.По сути, сложности Unicode (или, точнее, человеческих языков и их типографики) почти без конца.Мне иногда так кажется.

Список литературы

...