Преобразовать UTF-16 в кодовую страницу и удалить символы управления направлением текста в юникоде? - PullRequest
2 голосов
/ 03 апреля 2019

Короткая версия

  • Дано: 1/16/2006 2∶30∶11 ᴘᴍ
  • Как получить: 1/16/2006 2:30:11 PM
  • вместо: ?1/?16/?2006 ??2:30:11 ??

Фон

У меня есть пример строки в кодировке Unicode (UTF-16):

U+200e U+0031 U+002f U+200e U+0031 U+0036 U+002f U+200e U+0032 U+0030 U+0030 U+0036 U+0020 U+200f U+200e U+0032 U+2236 U+0033 U+0030 U+2236 U+0031 U+0031 U+0020 U+1d18 U+1d0d
 [LTR]      1      /  [LTR]      1      6      /  [LTR]      2      0      0      6         [RTL]  [LTR]      2      ∶      3      0      ∶       1      1             ᴘ      ᴍ

В несколько более легкой для чтения форме:

LTR 1 / LTR 16 / LTR 2006 RTL LTR 2∶30∶11 ᴘᴍ

Фактический окончательный текст в том виде, в котором вы должны его видеть:

enter image description here

В настоящее время я использую функцию Windows WideCharToMultiByte для преобразования UTF-16 в локальную кодовую страницу:

WideCharToMultiByte(CP_ACP, 0, text, length, NULL, 0, NULL, NULL);

и когда я делаю, текст выглядит так:

?1/?16/?2006 ??2:30:11 ??

Я не контролирую наличие маркеров направления текста Unicode; это вопрос безопасности. Но, очевидно, когда я конвертирую Unicode в (например) ISO-8859-1, эти символы не имеют значения, не имеют смысла, и я бы надеюсь можно бросить.

Существует ли функция Windows (например, FoldString, WideCharToMultiByte), которая может быть инструктирована для удаления этих не отображаемых непечатаемых символов?

1/16/2006 2∶30∶11 ᴘᴍ

Это сближает нас

Если бы функция делала это, отбрасывая непечатаемые символы, которые не имеют представления на целевой кодовой странице, мы получили бы:

1/16/2006 2∶30∶11 ᴘᴍ

При преобразовании в ISO-8859-1 он становится:

1/16/2006 2? 30? 11 ??

Это потому, что некоторые из этих символов не отображаются точно в ISO-8859-1:

1/16/2006 2 U + 2236 30 U + 2236 11 U + 1d18 U + 1d0d

1/16/2006 2 СООТНОШЕНИЕ 30 СООТНОШЕНИЕ 11 Малый капитал P Малый капитал M

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

  • Оригинал : 1/16/2006 2∶30∶11 ᴘᴍ
  • Отображено : 1/16/2006 2:30:11 PM

Есть ли функция, которая может это сделать?

Я счастлив страдать с:

  • 1/16/2006 2? 30? 11 ??

Но мне действительно нужно исправить:

  • ? 1 /? 16 /? 2006 ?? 2: 30: 11?

Unicode имеет понятие

Юникод уже имеет представление о том, какой «причудливый» символ можно заменить каким «нормальным».

Я знаю, что это технически для другой цели; . Но есть также общее понятие список отображения (что опять-таки для другой цели) .

Microsoft SQL Server, когда его просят вставить строку Unicode в столбец не-Unicode varchar, делает работу еще лучше:

enter image description here

Существует ли список соответствия для Unicode лучше всего подходит ?

Потому что реальность такова, что это просто создает беспорядок для пользователей:

enter image description here

...