В отсутствие спецификации есть быстрый и грязный способ, в котором я могу проверить, содержит ли символ char * символы UTF8?Проверьте, содержит ли символ char * символы UTF8?
ответ
Не надежно. Посмотрите на series Raymond Chen posts по этому вопросу.
Проблема в том, что UTF-8 без спецификации слишком часто неотличим от одинаково допустимого кодирования ANSI. Я думаю, что большинство решений (например, win32 API IsTextUnicode
) используют различные эвристики, чтобы дать лучшее представление о формате текста.
Вы можете проверить гипотезу, что это возможно, но я считаю, что вы можете только понять, что это не с уверенностью. Другими словами, вы можете проверить буфер, чтобы убедиться, что все байтовые последовательности являются законными UTF-8, что кодовые точки представлены с наименьшим количеством байтов, что нет 16-битовых суррогатных кодов и т. Д. Буфер, который передает все эти критерии, может казаться текстом, но вас можно обмануть.
В дополнение к обсуждению Раймонда Чена в Old New Thing, приведенном ответом Марка Пима, буфер действительно может содержать машинный код x86, который просто ограничивается подмножеством, которое, как представляется, является 7-разрядным печатным ASCII. Удивительно, что вы действительно можете писать значимые программы в этом подмножестве, одним из примеров которого является вирус антивирусной проверки EICAR.
Конечно, буфер, содержащий байтовые последовательности, которые имеют неправильный формат UTF-8, вероятно, не является текстом UTF-8. В этом случае у вас высокая степень уверенности. Тогда трюк заключается в том, чтобы выяснить, какая кодировка может быть на самом деле.
Если вы знаете (или можете предположить) что-то о семантическом содержимом буфера, вы также можете использовать его для поддержки своего определения. Например, если буфер должен содержать английский текст, то вряд ли он будет иметь кодовые слова с корейского языка, и он должен быть правильно написан правильно, следовать английской грамматике и т. Д. Это может стоить дорого, конечно ...
Для быстрого и грязного вы не можете делать намного лучше, чем регулярное выражение на this page. Если вы просто хотите знать, можно ли расшифровывать байты как UTF-8, это все, что вам нужно.
Просто проверьте, что последовательность байтов действительна как UTF-8. Если это так, вероятность того, что он является значимым текстом в любой другой кодировке, по существу равен нулю.
- 1. проверьте, является ли символ char
- 2. Проверьте, содержит ли Cstring только китайские символы
- 3. Проверьте символы, отличные от UTF8, в Javascript
- 4. Проверьте, содержит ли строка символ и номер
- 5. Проверьте, содержит ли строка какой-либо символ
- 6. Пройдите через строку и проверьте, содержит ли символ char и сохраняет символы в списке
- 7. Lua - Проверьте, содержит ли строка допустимые символы
- 8. Проверьте, содержит ли строка только специальные символы
- 9. Проверьте, содержит ли файл определенные символы ASCII
- 10. Проверьте, содержит ли строка определенные символы
- 11. Проверьте, содержит ли строка только заданные символы
- 12. Проверьте, содержит ли TStringList определенные символы?
- 13. Проверьте, содержит ли строка заданные символы
- 14. Swift: проверьте, содержит ли строка символ?
- 15. Проверьте, содержит ли значение строковый символ
- 16. Проверьте, содержит ли файл многобайтовый символ
- 17. Python: Проверьте, содержит ли строка китайский символ?
- 18. Проверьте, содержит ли строка только символ «&»
- 19. Проверьте, содержит ли ячейка подстроку
- 20. Обработка кодированного char * utf8 char *
- 21. Проверьте, не содержит ли строка только символы и символы подчеркивания
- 22. Проверьте, что NSString содержит только один символ.
- 23. Проверьте, если строка содержит символы
- 24. Проверьте, содержит ли поле @
- 25. Проверьте, содержит ли поле специальный символ в SQL
- 26. Проверьте, не содержит ли строка строки не указанные символы
- 27. Проверьте, если строка содержит определенные символы порядка
- 28. Android: проверьте, отображается ли символ/поддерживается символ?
- 29. Проверьте, содержит ли массив символов чисто цифры или чисто символы
- 30. Проверьте, присутствует ли Char в диапазоне
С помощью спецификации все еще неразличимо. Поэтому спецификация бесполезна в дополнение к тому, что она активно вредна. –