UTF8
Народ, подскажите, плиз, как можно проверить юникодную строку (WideString) на предмет того, УТФ8 она или нет?
Заранее спасибо!
Для ленивых вот:
http://ru.wikipedia.org/wiki/UTF-8
http://ru.wikipedia.org/wiki/Юникод
А после прочтения - открой справку Дельфи на тему WideString!!
ну вообще то я все это уже знаю... Что-нибудь конкретнее можеш подсказать?
Если знаешь всё, в чём проблема тогда? ;)
проблема в том, что не знаю, как проверить УТФ8 или нет :D
Если есть некоторая последовательность байтов и известно, что она является текстом на определенном языке, то единственный путь проверки - частотный анализ.
Хорошо, спасибо. А как тогда можно проверить обычную строку (типа String) на то, УТФ-8 она или нет? Если можно, м.б. есть конкретный алгоритм?
Если я не ошибаюсь, string - это ANSI. И точно не UTF-8. Объясни подробнее, нафига тебе это проверять?
Объясняю. Есть анси-стока (String). Если в ней текст в нормальном виде - то отлично, если в УТФ-8 - тогда надо делать Str:=UTF8Decode(Str). Если декодировать НЕ УТФ-8 строку, то получится фигня. Т.е. надо определить УТФ8 она или нет.
Помедленнее.
Достоверно определить кодировку фрагмента текста можно только единственным способом - снабдить его заголовком установленного формата, в котором эту кодировку указать явно.
Все остальные методы - вероятностные.
Естественно, вероятностные будут более или меннее хорошо работать только при условии существенных ограничений. В частности, крайне желательно знать, на каком языке эта строка. Тогда самый простой способ - частотный анализ. Вероятность правильного определения увеличивается с увеличением длины строки.
То есть однозначно это определить нельзя, тем более, что язык текста неизвестен. Ясно, спасибо.
Цитата: vinni-medved
То есть однозначно это определить нельзя, тем более, что язык текста неизвестен. Ясно, спасибо.
Более того, можно гарантировать, что текст на английском языке в ANSI и UTF-8 будет выглядеть идентично. Т.е. на подмножестве латинского алфавита эти кодировки совпадают. Ради чего, собственно, это и сделали.
http://ru.wikipedia.org/wiki/UTF-8
не понимаю, по этой ссылке уже можно составить простенький сканер, возвращает не УТФ, совместимо с УТФ и УТФ:
пусть у тебя последовательность байт и она является строкой.
По каждому байту, если значение < 127 - совместимо, след.; иначе если в $80 — $7FF : if (бaйт & $1F) = $C0 то следующий байт & $3F должен быть = $80 иначе не УТФ
и т.д.
т.е. идея ясна: сама кодировка строки в утф8 позволит тебе проверить ее совместимость. если сканер найдет хоть малейшее расхождение то это срока не в утф а иначе она скорее всего в утф - не забывай, что в ней могут быть не только буквы, но и символы и знаки, я уже молчу что строка может быть на редком языке... а такой подход гарантирует что последовательность байт может быть декодирована как утф8
ясно что обычная строка на английском языке в ANSI будет совместима, русская не утф на какой-то букве прервет сканер на несовместимости, если она конечно не составлена специальным образом... но как ты ставишь условие задачи таких строк на входе нет по определению, есть нормальные слова а не наборы букв
не понимаю, по этой ссылке уже можно составить простенький сканер, возвращает не УТФ, совместимо с УТФ и УТФ:
пусть у тебя последовательность байт и она является строкой.
По каждому байту, если значение < 127 - совместимо, след.; иначе если в $80 — $7FF : if (бaйт & $1F) = $C0 то следующий байт & $3F должен быть = $80 иначе не УТФ
и т.д.
т.е. идея ясна: сама кодировка строки в утф8 позволит тебе проверить ее совместимость. если сканер найдет хоть малейшее расхождение то это срока не в утф а иначе она скорее всего в утф - не забывай, что в ней могут быть не только буквы, но и символы и знаки, я уже молчу что строка может быть на редком языке... а такой подход гарантирует что последовательность байт может быть декодирована как утф8
ясно что обычная строка на английском языке в ANSI будет совместима, русская не утф на какой-то букве прервет сканер на несовместимости, если она конечно не составлена специальным образом... но как ты ставишь условие задачи таких строк на входе нет по определению, есть нормальные слова а не наборы букв
Почему ж браузеры не всегда удачно подбирают кодировки автоматически? Почему они дают возможность пользователю "потрахаться" с кодировкой? Если все оказывается так просто. Тут точно заговор!! :D
[/offtop]
Короче "однозначно это определить нельзя"