Немецкие умлаут бинарные представления - PullRequest
0 голосов
/ 26 января 2019

У меня странная проблема, когда две переменные Unicode, которые я пытаюсь сравнить, выглядят одинаково, но они различаются в двоичных представлениях. Когда я смотрю на загруженный файл, он обнаруживается с немного отличающимися двоичными представлениями имени файла. Это происходит только при загрузке из браузера Safari. Я не специалист по Unicode. Я озадачен двумя строками, которые имеют различное двоичное представление Unicode, но одинаковы.

Есть ли у какого-нибудь тела понимание, почему это так? Что означает лишний байт для представления немецкого умлаута?

     apple-macintosh:~ vijay$ hexdump /tmp/a
     0000000 55 6e 74 65 72 73 74 c3 bc 74 7a 74 65 5f 50 72
     0000010 6f 6a 65 6b 74 65 2e 64 6f 63 78               
     000001b
     apple-macintosh:~ vijay$ more /tmp/a
     Unterstützte_Projekte.docx
     apple-macintosh:~ vijay$ hexdump /tmp/b
     0000000 55 6e 74 65 72 73 74 75 cc 88 74 7a 74 65 5f 50
     0000010 72 6f 6a 65 6b 74 65 2e 64 6f 63 78            
     000001c
     apple-macintosh:~ vijay$ more /tmp/b
     Unterstützte_Projekte.docx
     apple-macintosh:~ vijay$ 

Последовательность байтов 0xc3bc (umlaut) представлена ​​как 75cc88. Я не уверен, являются ли они отличным представлением умлаута. Любое понимание было бы очень полезно для меня, чтобы увидеть, как я могу надежно сравнить эти имена файлов

1 Ответ

0 голосов
/ 26 января 2019

C3 BC - это форма единой кодовой точки Unicode в кодировке UTF-8 ü.

75 CC 88 - это кодированная в UTF-8 форма двух кодовых точек Unicode u и ̈.

Вторая - это разложенная форма с ASCII u и знаком объединения.

Некоторые языки программирования имеют библиотеки для решения этой проблемы, например, Python:

>>> import unicodedata as ud
>>> s = 'Unterstützte_Projekte.docx'
>>> s1 = ud.normalize('NFC',s) # Combined form
>>> s2 = ud.normalize('NFD',s) # Decomposed form
>>> s1 == s2                   # They don't compare equal
False
>>> print(s1)                  # But look the same...
Unterstützte_Projekte.docx
>>> print(s2)
Unterstützte_Projekte.docx

Преобразование двух значений в одно и то же из сравнения

>>> ud.normalize('NFC',s1) == ud.normalize('NFC',s2)
True
>>> ud.normalize('NFD',s1) == ud.normalize('NFD',s2)
True

Для справки см. Unicode.org Формы нормализации Unicode .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...