Как сделать, чтобы UTF-8 авто определялся?

Russian main discussion
Post Reply
  • Author
  • Message
Offline
Posts: 3
Joined: Fri Jul 18, 2014 8:41 am

Как сделать, чтобы UTF-8 авто определялся?

Post by basinilya »

Скачал сегодня. В настройках распознавание кодировки кириллица.
Сохраняю файл как utf8, переименовываю, чтобы из кодировка не бралась из "последние файлы". Открываю: Дурак

Wio
Offline
Posts: 76
Joined: Wed Jan 05, 2011 6:07 am

Post by Wio »

basinilya
В окне сохранения при выборе кодировки нужно отметить галочку "BOM" (byte order mark).

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

Options (menubar's menuitem) > Settings (button's menuitem) > General (tab) > Default codepage (dropdown list): 65001 (UTF-8)

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Мне кажется, корень описанной проблемы в том, что полностью корректная последовательность из 10 байт, формирующая 5 символов UTF-8, по каким-то причином не определяется AkelPad-ом как UTF-8.
Поскольку определение кодировки в AkelPad опирается на какие-то таблицы, мне сложно прокомментировать, почему именно в этом случае авто-определение UTF-8 не срабатывает.
Упоминаемый мной "прямой" алгоритм определения UTF-8, основывающийся чисто на статье Википедии, описывающей спецификацию UTF-8, в этом фрагменте безошибочно узнаёт UTF-8.

Code: Select all

typedef int bool_t;

// Check up to 6 utf-8 bytes.
// FYI, the BOM [0xEF, 0xBB, 0xBF] satisfies these requirements
bool_t IsStringUtf8(const char* s)
{
    bool_t containsUtf8; // contains utf-8 leading byte(s)
    bool_t errorUtf8;    // error: unexpected byte in utf-8 sequence
    unsigned int n;      // number of continuation bytes
    unsigned char uch;

    containsUtf8 = 0;
    errorUtf8 = 0;
    n = 0;

    while ( (!errorUtf8) && ((uch = (unsigned char) *s) != 0) )
    {
        if ( n == 0 )
        {
            if ( uch >= 0xC0 )
            {
                containsUtf8 = 1;
                if ( uch < 0xE0 )
                    n = 1;
                else if ( uch < 0xF0 )
                    n = 2;
                else if ( uch < 0xF8 )
                    n = 3;
                else if ( uch < 0xFC )
                    n = 4;
                else if ( uch < 0xFE )
                    n = 5;
                else
                    n = 6;
            }
            else if ( uch >= 0x80 )
                errorUtf8 = 1;
        }
        else
        {
            if ( uch >= 0x80 && uch < 0xC0 )
                --n;
            else
                errorUtf8 = 1;
        }
        ++s;
    }

    return (containsUtf8 && (!errorUtf8) && (!n)) ? 1 : 0;
}

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »


DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Instructor,
Но для UTF-8 существуют чётко прописанные зависимости в последовательности байт, и в принципе даже по одному многобайтному символу UTF-8 (по двум или более байтам) можно определить, это UTF-8 или нет. А уж для 5 многобайтных символов это можно сказать наверняка.
Т.е. что я хочу сказать: в случае с UTF-8 у нас не та ситуация, где кодировка "угадывается" - нет, для UTF-8 мы можем совершенно точно определить, является ли последовательность байт UTF-8 или нет.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

DV wrote:Instructor,
Но для UTF-8 существуют чётко прописанные зависимости в последовательности байт, и в принципе даже по одному многобайтному символу UTF-8 (по двум или более байтам) можно определить, это UTF-8 или нет. А уж для 5 многобайтных символов это можно сказать наверняка.
А если такие символы не попали в буфер (даже увеличенный до 8196)?
Или текст по большей части состоит из латинских букв и знаков препинания (не всех), которые есть однобайтовые, а в AkelPad стоит дефолтная б-гомерзкая СР1251?

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Skif_off,
В данной ситуации у нас 5 многобайтных символов UTF-8, которые иначе как UTF-8 можно распознать только ошибочно: Дурак
В общем же случае вы правы: если нет многобайтных UTF-8 символов, то UTF-8 не признать. Но если есть хотя бы несколько, то это уже потенциально UTF-8. А в нашей ситуации все 5 символов удовлетворяют условию многобайтного UTF-8, то есть выбор очевиден.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

DV
FAQ wrote:2. Возможно файл слишком маленький. Символов для распознавания должно быть больше 11.

Offline
Posts: 3
Joined: Fri Jul 18, 2014 8:41 am

Post by basinilya »

Wio wrote:basinilya
В окне сохранения при выборе кодировки нужно отметить галочку "BOM" (byte order mark).
Это чит

Offline
Posts: 3
Joined: Fri Jul 18, 2014 8:41 am

Post by basinilya »

Instructor wrote:DV
FAQ wrote:2. Возможно файл слишком маленький. Символов для распознавания должно быть больше 11.
Это помогло. Но вообще для utf надо бы свою распознавалку, как писали выше

Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

Хотелось бы отдельную распознавалку для UTF-8... Но, возможно, проблема в том, что Instructor ориентируется не только на латиницу и кириллицу. А тот же "дурак", написанный по-японски будет выглядеть несколько иначе...
Post Reply