![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Надо проверить строку(Widestring) и определить содержатся ли там символы, которые могут не отображаться на компах с другими локальными установками. Например: русские буквы, латышские, иероглифы и т.п.
Первая идея была пройтись по байтам строки и проверить каждый второй символ, если он не равен 0, значит - символ расщиренный, а следовательно и строка расширенная(Unicode). Немного подумав заменил манипуляции с указателями на проверку значения функции Ord для каждого символа. Сейчас функция выглядит так:
Всё в принципе работает. Русские и латышские символы определяются как Unicode, а английские - нет. Западноевропейские сивмолы(áäßøæµ) с такой проверкой в категорию Unicode не попадают. И тут меня стали мучать сомнения. Правильно это или нет. Ведь 255 - это было в DOSe(255 символов кодовой страницы OEM), но в Винде ведь всё по другому. Прошу советов. 1) Как вы считаете будет ли эта функция корректно отделять зёрна от плевел символы читающиеся на компах с любой локалью, от символов корректное отображение которых зависит от текущей локали. 2) если да, то можно ли считать эту проверку корректной Ord(aText[i+1])>255 ? |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
вообщето каждый символ 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 -------------------- There are always someone smarter than you... |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Спасибо за совет, но это совсем не то что нужно. ![]() Возможно я плохо сформулировал: Итак нужно проверить строку и определить в каком формате её хранить: в Unicode или в Ansi. При этом надо быть уверенным, что на системе с другой локалью все символы Анси отобразятся как надо. |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Пока писал ответ, пришло в голову решение. Я изначально задал некорректный вопрос. Надо было определить не то является ли текст юникодным, а все ли символы текста могут отображаться в кодировке ISO-8859-1 (Latin 1)(основная кодировка для всех систем). Как только я понял свою ошибку, сразу же стало ясно как проверять.
Вот исправленный текст, если кому интересно:
p.s. а функция IsTextUnicode проверяет, являются ли данные в буфере Unicodeной строкой . (т.е. проверяют порядок байт, закрывающие байты, и прочие мелочи) |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Короткий способ: Если строка, конвертнутая в UTF8 равна исходной строке, значит нет национальных символов.
|
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
ну а тебе что надо??? смотри опции функции IsTextUnicode: ![]() IS_TEXT_UNICODE_ASCII16 The text is Unicode, and contains onlyzero-extended ASCII values/characters. или я чото непонимаю ![]() -------------------- There are always someone smarter than you... |
|||
|
||||
Bose |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Через UTF8Encode?
Вызов IsTextUnicode с этим флагом, это тоже самое, что проверять каждый второй байт на равенство #0. MetalFan, спасибо за помощь, я вчера смотрел эту функцию на деле. Она совсем не подходит. |
||||
|
|||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
if UTF8Encode(s) = s then нет_национальных_символов
где s: string; |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Спасибо за столь подробные разъяснения ![]() |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
плохо видимо смотрел ;) ты не прав) она будет проверять так, как ты укажешь. в т.ч. так же, как и в приведенном тобой коде. з.ы. проверка Ord(text[i])>$FF тоже самое по сути делает. т.е. проверяет "второй" байт на <>0; Это сообщение отредактировал(а) MetalFan - 8.2.2007, 14:37 -------------------- There are always someone smarter than you... |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Хммм... Ну в принципе да. Но... Насколько я понимаю, WideString - это ещё не Unicode, разве не так? ![]() Собственно у меня эта функция с последним параметром options:=nil(провряет по всем условиям), работала совершенно невообразимым образом, выдавая False для строки из одного символа и True для всех остальных. Так что я махнул на неё рукой. С конкретными флагами я не проверял, лень было искать их значения.(в Delphi 7 их нет) К тому же, как я уже написал выше, я выяснил, что мне нужно было проверять не "Unicode - или нет Unicode", a "всё что не ISO-8859-1 (Latin 1), то Unicode". |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
причем тут WideString и Юникод?
в делфи WideString используются для работы с юникод строками. т.е. там на символ по 2 байта, а не 1, как в AnsiString. если в IsTextUnicode передать в опции "1", что соответствует той опции IS_TEXT_UNICODE_ASCII16, то проверка будет работать практически как та, что тобой приведена выше. но имхо правильное использование IsTextUnicode - более верное решение для программирования под Win, чем написание собственных проверок, которые могут на самом деле не соответствовать действительности ;) -------------------- There are always someone smarter than you... |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |