как определить кодировку UTF8?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

AlexEr81
новенький
Сообщения: 17
Зарегистрирован: 24.01.2014 19:57:31

как определить кодировку UTF8?

Сообщение AlexEr81 »

Здравствуйте! Подскажите как определить, что текстовый файл в кодировке UTF8 или cp1251, если в нём нет BOM?
может есть функции в free-паскале ?
Аватара пользователя
DYUMON
постоялец
Сообщения: 234
Зарегистрирован: 11.03.2009 12:32:54
Контактная информация:

Сообщение DYUMON »

сравнить его с этой картинкой
Изображение
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

или попробовать http://chsdet.sourceforge.net/. Или воспользоваться : http://wiki.freepascal.org/UTF8_Tools. Если не ошибаюсь: последний то же может определить.
Ну или методом DYUMON. Или вики в подмогу, плюс на этом форуме есть ветки.
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

В LazUTF8 есть функция FindInvalidUTF8Character, может определить имеются ли в строке не UTF8 символы, но она не скажет к какой кодировке эти не UTF8 символы относятся..
AlexEr81
новенький
Сообщения: 17
Зарегистрирован: 24.01.2014 19:57:31

Сообщение AlexEr81 »

http://chsdet.sourceforge.net/ неправильно определяет если в тексте кириллица. С http://wiki.freepascal.org/UTF8_Tools. пока неразобрался
FindInvalidUTF8Character подойдёт.
мне нужно прочитать конфигурационный текстовый файл, и если он в кодировке cp1251 то преобразовать текст в UTF8
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

AlexEr81 писал(а):мне нужно прочитать конфигурационный текстовый файл, и если он в кодировке cp1251 то преобразовать текст в UTF8

При такой задаче: Можно попробовать смотреть длину буквы "а", если она равна 1, то это cp1251, ну а если 2, то это UTF8.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

vitaly_l, в том то и проблема, что пока не определена кодировка нельзя сказать сколько места занимает символ.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Лекс Айрин писал(а):vitaly_l, в том то и проблема, что пока не определена кодировка нельзя сказать сколько места занимает символ.

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var str:string;
begin
  str := 'йапона мать!';
  if pos('а',str) = 3 then str := 'imUTF8' else  str := 'imCp1251' ;
  ShowMessage(str+' '+IntToStr(pos('а',str)));
end;
Последний раз редактировалось vitaly_l 14.04.2017 12:48:38, всего редактировалось 1 раз.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

vitaly_l, попробуй. Только не забывай, что:
1) текст загружается с файла
2) строке, по большому счету, положить на кодировку.
3) А ты точно уверен, что размеры и положение в таблице символов конкретного тестового символа не совпадут для обеих проверяемых кодировок?
4)то, что в строке явная белиберда не означает, что пользователь ее не написал.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Лекс Айрин писал(а):А ты точно уверен, что размеры и положение в таблице символов конкретного тестового символа не совпадут для обеих проверяемых кодировок?

Русский символ: "а", в utf8 занимает - два символа, а в Cp1251 - один. На это можно смело опираться.
Лекс Айрин писал(а):попробуй. Только не забывай

Я показал как, а остальное: "дело мастера боится".

Добавлено спустя 222 минут 222 секунд:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var str:string;
begin
  str := Utf8ToWinCp('йапона мать!');
  //str := 'йапона мать!';
  if pos('а',str) = 3 then str := 'imUTF8' else  str := 'imCp1251' ;
  ShowMessage(str+' '+IntToStr(pos('а',str)));
end;
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

vitaly_l писал(а):Русский символ: "а", в utf8 занимает - два символа, а в Cp1251 - один.


Это играет роль только если заранее известна кодировка. При том, что ansi может быть и в "широких" строках.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Лекс Айрин писал(а):Это играет роль только если заранее известна кодировка.

Ты что, пил с утра?

Получается, если кодировка конкретно Лексу и Айрину - заранее не известна, то буква "а" может занять любое кол-во символов в pos ? Это что-то типа, Корпускулярно-волнового дуализма :roll: : когда Лекс и Айрин - знают название кодировки, она занимает 2 символа, но когда не знают, то любое значение...
AlexEr81
новенький
Сообщения: 17
Зарегистрирован: 24.01.2014 19:57:31

Сообщение AlexEr81 »

заранее неизвестно какие там будут буквы.. не перебирать же алфавит
Аватара пользователя
DYUMON
постоялец
Сообщения: 234
Зарегистрирован: 11.03.2009 12:32:54
Контактная информация:

Сообщение DYUMON »

где то видел способ про проверку на символ с кодом #0 дескать в utf8 его нет
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

vitaly_l писал(а):Получается, если кодировка конкретно Лексу и Айрину - заранее не известна, то буква "а" может занять любое кол-во символов в pos ?

Нет, мы просто (ни Лекс, ни Айрин) не знаем действительно ли найденный байт (или 2) это буква "а" ("б", "с", "д"...)
vitaly_l писал(а): Это что-то типа, Корпускулярно-волнового дуализма :roll:

типа того... символ Шредингера. При том, в общем случае, мы никак не можем определить кодировку. Программы анализа просто делают прогноз на основе определенной базы слов... если найдут хоть одно (2, 3,4...), то кодировка считается правильной. Иногда можно, конечно, предположить на основе определенных знаний о самой кодировке... Например, из-за наличия неестественно большого количества нулевых символов.
Ответить