Что это значит, когда мой текст отображается как вопросительные знаки?
Я пытаюсь отобразить некоторый текст в моей программе, используя, скажем, Windows GDI, а некоторые символы Юникода отображаются в виде вопросительных знаков? Как жизнь?
Смотрите также: Что это означает, когда мой текст отображается в виде полей?
3 ответа
В Windows есть 2 распространенные проблемы с отображением, которые возникают при попытке отобразить символы Unicode:
текст иногда появляется в виде вопросительных знаков
- Это происходит, когда данные Unicode преобразуются в 8-битную кодировку набора символов (или технически многобайтовые символы) обычно через системную кодовую страницу (но другие кодовые страницы могут быть указаны в вызовах преобразования). Если целевой 8-битный набор символов не включает необходимые символы, любые символы, не представленные в целевом наборе символов, преобразуются в вопросительные знаки.
текст иногда отображается в виде полей
- Это проблема с шрифтом, не имеющим glpyh для конкретного символа. Поля отображаются, когда есть несоответствие между символами Unicode в документе и теми, которые поддерживаются шрифтом. В частности, поля представляют символы, не поддерживаемые выбранным шрифтом.
Это означает, что ваш текст Unicode где-то конвертируется в текст ANSI. Поскольку символы Unicode за пределами Latin-1 не могут быть преобразованы в ANSI, они преобразуются в вопросительные знаки. Убедитесь, что ваша программа скомпилирована с поддержкой Unicode (т.е. символы препроцессора UNICODE и _UNICODE # определены вашим проектом), чтобы вы всегда вызывали правильные версии Unicode различных функций Windows.
В основном вы испортили текст. Вы берете текст Unicode в одной кодировке, а затем конвертируете его в другую кодировку, не проверяя, чтобы целевая кодировка включала все символы в исходном тексте. Сделав это, вы получите кучу бреда.
Способы сделать это включают в себя:
- Обрабатывать текст UTF-8 как ANSI (без предварительного преобразования в допустимую кодовую страницу)
- Преобразование текста Unicode в кодовую страницу без проверки, содержит ли кодовая страница правильные символы.