Какой многобайтовый набор символов начинается с 0x7F и имеет длину 4 байта?

StackOverflow https://stackoverflow.com/questions/680495

  •  22-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь получить какой-нибудь устаревший код для правильного отображения китайских иероглифов.Одна кодировка символов, с которой я пытаюсь работать, начинается с 0x7F и имеет длину 4 байта (включая байт 0x7F).Кто-нибудь знает, что это за кодировка и где я могу найти информацию для нее?Спасибо..

Обновить:Мне также приходилось работать с некоторой японской кодировкой, которая начинает каждый символ с 0xE3 и имеет длину в три байта.Он отображается на моем компьютере правильно, если я выбираю японскую локаль в Windows, однако в нашем приложении он отображается неправильно.Однако, если выбран любой другой язык, отличный от японского, я не могу даже правильно просмотреть имена файлов.Поэтому я предполагаю, что эта кодировка не является Юникодом.Кто-нибудь знает, что это такое?Это АНСИ?Это сдвиг JIS?

Что касается китайского, я протестировал его с символами Unicode и UTF-8, и я получаю тот же шаблон;0x7F, за которым следуют три байта.Являются ли Unicode и UTF-8 одинаковыми?

Это было полезно?

Решение

Одна кодировка символов, с которой я пытаюсь работать, начинается с 0x7F и имеет длину 4 байта

Каковы остальные байты?Есть ли у вас какой-нибудь латинский текст в этой кодировке?

Если это “0x7f 0x...0x00 0x00” вы смотрите на UTF-32LE.Это также может быть два символа UTF-16 (либо LE, либо BE).

Большинство восточноазиатских кодировок используют 0x80-0xFF в качестве начальных байтов для символов, отличных от ASCII;я не знаю ни одного, который использовал бы начальный 0x7F как что-либо иное, кроме удаления ASCII.

ETA:

должны ли быть Метки порядка байтов?

Спецификация не требуется, если существует внеполосный способ сигнализации о том, что кодировка ‘UTF-32LE’ (возможно, та, которая теряется до того, как она попадет к вам).

Мне также приходилось работать с некоторой японской кодировкой, которая начинает каждый символ с 0xE3 и имеет длину в три байта.

Это, конечно, UTF-8.Последовательность 0xE3 0x...0x...в результате получился бы персонаж между U + 3000 и U + 4000, где и обитает хирагана / катакана.

Он отображается на моем компьютере правильно, если я выбираю японскую локаль в Windows, однако в нашем приложении он отображается неправильно.

Тогда, скорее всего, ваше приложение является одним из прискорбной орды приложений, не совместимых с Юникодом, все еще использующих ‘A’ (*) версии интерфейсов Win32 внутри интерфейсов с суффиксом ‘W’.Можете ли вы читать в строке в соответствии с ее реальной кодировкой, является спорным:приложение, не совместимое с Unicode, никогда не сможет отображать восточноазиатский иероглиф в западной локали.

(*:назван в честь “ANSI”, который является вводящим в заблуждение термином Windows, обозначающим “любую системную кодовую страницу, установленную на данный момент”.Вот почему изменение вашей локали повлияло на это.)

Расчетное ВРЕМЯ прибытия (2):

Ладно, взломал его.Это не какая-либо стандартизированная кодировка, с которой я встречался раньше, но ее относительно легко расшифровать, если исходить из предпосылки, что кодируются кодовые точки Unicode.

0x00-0x7E: plain ASCII
0x7F A B C: Unicode character

Символ, закодированный в escape-кодировке Unicode, может быть вычислен путем взятия индекса в ключевой строке A, B и C и сложения вместе:

A*0x1000 + B*0x40 + C

То есть это набор символов base-64, но это не обычный стандарт Base64.Небольшое экспериментирование дает ключевую строку:

.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz

Символы ‘.’ и ‘_’ являются предположениями, поскольку ни один из размещенных вами символов их не использует.Нам понадобилось бы больше данных, чтобы найти точную строку.

Так, например:

0x7F 3 u g
A=4 B=58 C=44
4*0x1000 + 58*0x40 + 44 = 0x4EAC
U+4EAC = 京

Расчетное ВРЕМЯ прибытия (3):

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

Я предположил, что это должны быть кодовые точки Unicode, заметив, что три символа примера имели первые escape-символы в том же общем диапазоне и в том же числовом порядке, что и их кодовые точки Unicode.Два других символа, казалось, менялись случайным образом, так что, скорее всего, это была кодировка кодовой точки в формате big-endian, и, вероятно, кодировка base-64, поскольку 6 - это столько бит, сколько вы можете извлечь из читаемого ASCII.

Стандартный Base64 сам по себе начинается с букв, что привело бы к тому, что что-то, начинающееся с цифры, находилось бы слишком далеко, чтобы находиться в Базовой многоязычной плоскости.Итак, я начал угадывать с ‘0123456789ABCDEFG ...’, что было бы другим очевидным выбором ключевой строки.Это дало результирующие числа, которые были близки к кодовым точкам для заданных символов, но немного занижены.При вставке дополнительного символа в начале строки ключа (чтобы цифра ‘0’ не соответствовала номеру 0) один из символов был правильным, а два других - очень близкими;в том, который был правильным, не было строчных букв, поэтому, чтобы изменить только строчные буквы, я вставил еще один символ между верхним и нижним регистрами.В результате получились правильные цифры.

Не гарантируется, что это действительно правильно, но (помимо произвольного выбора вставленных символов) очень вероятно, что так оно и есть.

Другие советы

Возможно, вы захотите взглянуть на кодировка китайских символов страница в Википедии.Единственная кодировка, которую я вижу, которая всегда равна 4 байтам, это UTF-32.

ГБ 18030 это текущий стандартный набор китайских символов, но его длина может составлять от 1 до 4 байт.

Попробуй шардэ.Он хорошо справляется с угадыванием кодировки символов строки байтов.

Являются ли Unicode и UTF-8 одинаковыми?

Нет.UTF-8 - это всего лишь один из способов представления символов Юникода в виде последовательности байтов.Unicode - это полный стандарт, присваивающий каждому символу числовые и удобочитаемые идентификаторы, а также множество метаданных о символах.

Это может быть допустимая кодировка unicode, например суррогатная пара utf-8 или UTF16.

Да, китайский - это UTF-8, реализация (кодировка) Unicode.Длина UTF-8 составляет 1 байт для символов ASCII и до 4 байт для других.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top