| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Проверить строку: Unicode или нет |
| Автор: Bose 7.2.2007, 03:53 | ||
| Надо проверить строку(Widestring) и определить содержатся ли там символы, которые могут не отображаться на компах с другими локальными установками. Например: русские буквы, латышские, иероглифы и т.п. Первая идея была пройтись по байтам строки и проверить каждый второй символ, если он не равен 0, значит - символ расщиренный, а следовательно и строка расширенная(Unicode). Немного подумав заменил манипуляции с указателями на проверку значения функции Ord для каждого символа. Сейчас функция выглядит так:
Всё в принципе работает. Русские и латышские символы определяются как Unicode, а английские - нет. Западноевропейские сивмолы(áäßøæµ) с такой проверкой в категорию Unicode не попадают. И тут меня стали мучать сомнения. Правильно это или нет. Ведь 255 - это было в DOSe(255 символов кодовой страницы OEM), но в Винде ведь всё по другому. Прошу советов. 1) Как вы считаете будет ли эта функция корректно отделять зёрна от плевел символы читающиеся на компах с любой локалью, от символов корректное отображение которых зависит от текущей локали. 2) если да, то можно ли считать эту проверку корректной Ord(aText[i+1])>255 ? |
| Автор: MetalFan 7.2.2007, 09:33 | ||
| вообщето каждый символ WideString - это двухбайтовый Unicode символ. тогда уж сначала бери старший байт и его проверяй. но зачем изобретать велосипед, если в винде уже его изобрели The IsTextUnicode function determines whether a buffer is likely to contain a form of Unicode text. The function uses various statistical and deterministic methods to make its determination, under the control of flags passed via lpi. When the function returns, the results of such tests are reported via lpi.
з.ы. смотрим MSDN |
| Автор: Bose 8.2.2007, 04:10 | ||
| Пока писал ответ, пришло в голову решение. Я изначально задал некорректный вопрос. Надо было определить не то является ли текст юникодным, а все ли символы текста могут отображаться в кодировке http://www.microsoft.com/globaldev/reference/iso/28591.mspx(основная кодировка для всех систем). Как только я понял свою ошибку, сразу же стало ясно как проверять. Вот исправленный текст, если кому интересно:
p.s. а функция IsTextUnicode проверяет, являются ли данные в буфере Unicodeной строкой . (т.е. проверяют порядок байт, закрывающие байты, и прочие мелочи) |
| Автор: Snowy 8.2.2007, 11:53 |
| Короткий способ: Если строка, конвертнутая в UTF8 равна исходной строке, значит нет национальных символов. |
| Автор: MetalFan 8.2.2007, 12:26 | ||
ну а тебе что надо??? смотри опции функции IsTextUnicode: IS_TEXT_UNICODE_ASCII16 The text is Unicode, and contains onlyzero-extended ASCII values/characters. или я чото непонимаю |
| Автор: Bose 8.2.2007, 12:43 | ||||
Через UTF8Encode?
Вызов IsTextUnicode с этим флагом, это тоже самое, что проверять каждый второй байт на равенство #0. MetalFan, спасибо за помощь, я вчера смотрел эту функцию на деле. Она совсем не подходит. |
| Автор: Snowy 8.2.2007, 12:53 |
| if UTF8Encode(s) = s then нет_национальных_символов где s: string; |
| Автор: Bose 8.2.2007, 13:48 |
Спасибо за столь подробные разъяснения |
| Автор: MetalFan 8.2.2007, 14:31 |
плохо видимо смотрел ;) ты не прав) она будет проверять так, как ты укажешь. в т.ч. так же, как и в приведенном тобой коде. з.ы. проверка Ord(text[i])>$FF тоже самое по сути делает. т.е. проверяет "второй" байт на <>0; |
| Автор: Bose 8.2.2007, 15:57 | ||
Хммм... Ну в принципе да. Но... Насколько я понимаю, WideString - это ещё не Unicode, разве не так? Собственно у меня эта функция с последним параметром options:=nil(провряет по всем условиям), работала совершенно невообразимым образом, выдавая False для строки из одного символа и True для всех остальных. Так что я махнул на неё рукой. С конкретными флагами я не проверял, лень было искать их значения.(в Delphi 7 их нет) К тому же, как я уже написал выше, я выяснил, что мне нужно было проверять не "Unicode - или нет Unicode", a "всё что не ISO-8859-1 (Latin 1), то Unicode". |
| Автор: MetalFan 8.2.2007, 16:06 |
| причем тут WideString и Юникод? в делфи WideString используются для работы с юникод строками. т.е. там на символ по 2 байта, а не 1, как в AnsiString. если в IsTextUnicode передать в опции "1", что соответствует той опции IS_TEXT_UNICODE_ASCII16, то проверка будет работать практически как та, что тобой приведена выше. но имхо правильное использование IsTextUnicode - более верное решение для программирования под Win, чем написание собственных проверок, которые могут на самом деле не соответствовать действительности ;) |
| Автор: Bose 8.2.2007, 16:24 | ||
Могут, но... в чём именно? |