Короткая версия
- Дано:
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](https://i.stack.imgur.com/ofSf9.png)
В настоящее время я использую функцию 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?
Unicode имеет понятие
Юникод уже имеет представление о том, какой «причудливый» символ можно заменить каким «нормальным».
Я знаю, что это технически для другой цели; . Но есть также общее понятие список отображения (что опять-таки для другой цели) .
Microsoft SQL Server, когда его просят вставить строку Unicode в столбец не-Unicode varchar
, делает работу еще лучше:
![enter image description here](https://i.stack.imgur.com/eI7cL.png)
Существует ли список соответствия для Unicode лучше всего подходит ?
Потому что реальность такова, что это просто создает беспорядок для пользователей:
![enter image description here](https://i.stack.imgur.com/Uplo6.png)