Как определить символы в кодировке Windows-1251

Есть ли правильный способ обнаружить символы в кодировке Windows-1251?

IMO, в отличие от многобайтовых собственных символов, Windows-1251 является 8-битной кодировкой символов, поэтому его невозможно отличить от других 8-битных собственных символов, таких как latin1. Если я ошибаюсь, поправьте меня.

Первая подсказка для меня - locale, я беру все символы non-ascii как Windows-1251, если локаль ru.

Есть ли способы лучше?

ОБНОВИТЬ:

Вот контекст моего вопроса, в информации ID3 файлов MP3 есть некоторые Windows-1251 закодированные символы, мне нужно обнаружить Windows-1251 закодированные символы, а затем преобразовать их в UTF-16 с помощью icu4c, иначе эти Windows-1251 закодированные символы будут представлены нечитаемыми в моей системе (Android). Думаю, у некоторых из вас есть способы получше.


person Alan    schedule 09.07.2013    source источник
comment
От чего вы пытаетесь это обнаружить?   -  person David Heffernan    schedule 09.07.2013
comment
Некоторые файлы MP3 содержат кириллические символы в тегах ID3, закодированных в Windows-1251.   -  person Alan    schedule 09.07.2013
comment
Итак, вы хотите иметь возможность взять файл MP3 и определить, закодированы ли теги ID3 в 1251?   -  person David Heffernan    schedule 09.07.2013
comment
Я хочу сказать, закодированы ли теги ID3 в 1251. Затем я могу правильно преобразовать 1251 в UTF, используя icu4c. Потому что некоторые из 1251 закодированных символов в моей системе (Android) не читаются. Я ясно выражаюсь?   -  person Alan    schedule 09.07.2013


Ответы (2)


Не существует надежного способа определить, когда в качестве входных данных используется массив из 8-битных символов, какая 8-битная кодировка была использована для этих символов.

person David Heffernan    schedule 09.07.2013
comment
Значит, использование локали - это действительно правильный способ? - person Alan; 09.07.2013
comment
Нет. Моя машина не использует 1251, и ваши файлы по-прежнему будут содержать 1251 закодированных тегов, когда вы переместите файл на мою машину. - person David Heffernan; 09.07.2013
comment
Я имею в виду, что если локаль - ru (русский), то я рассматриваю однобайтовые символы, отличные от ascii, как Windows-1251. Поскольку наш целевой рынок - русский, я столкнулся с проблемой нечитаемых символов в некоторых русских MP3-файлах. - person Alan; 09.07.2013
comment
Решать вам. Конечно, вы можете встретить множество mp3-файлов с тегами UTF-8. - person David Heffernan; 09.07.2013
comment
@Alan Вы не можете надежно определить кодовую страницу файла, вам нужно сообщить ее вместе с файлом. Единственный способ сделать это - создать действительно сложный набор эвристик, который потребует много работы для исследования, тестирования и иного обеспечения правильной работы. Большие проблемы возникают, например, при различении между ISO-8859-1 и Windows-1252, где различия крайне незначительны. Дополнительная информация в этом вопросе: Как определить кодировку / кодовую страницу текстового файла. - person Cody Gray; 10.07.2013
comment
Я рекомендую попросить пользователя идентифицировать свой файл, если он еще не содержит идентифицирующей информации. Так делают почти все текстовые редакторы, кроме тех, которые ошибаются (например, Блокнот). - person Cody Gray; 10.07.2013
comment
@CodyGray Вы правы, я не могу с этим согласиться. - person Alan; 10.07.2013

Для определения этого можно использовать функцию GetACP. Он возвращает идентификатор кодовой страницы ANSI, которая в настоящее время активна для системы.

Документированный список идентификаторов кодовых страниц можно найти здесь . Вы ищете 1251, что соответствует кодовой странице "ANSI Cyrillic (Windows)".

Очень просто использовать из кода; например в C:

#include <Windows.h>

int main()
{
    if (GetACP() == 1251)
    {
        MessageBoxW(NULL,
                    L"Your system uses the ANSI Cyrillic code page.",
                    L"Code Page Detection",
                    MB_OK | MB_ICONINFORMATION);
    }
    return 0;
}
person Cody Gray    schedule 09.07.2013
comment
Спасибо, но, возможно, вы неправильно поняли мой вопрос из-за моего плохого английского. На самом деле, мне нужно различать собственные символы, чтобы увидеть, закодирована ли она в Windows-1251 (кириллица), и если да, то я конвертирую их в UTF с помощью icu4c. Я ясно выражаюсь? - person Alan; 09.07.2013