Преобразование UTF-8 без XML-файла BOM в ISO 8859-1

У меня есть xml-файл в кодировке UTF-8 без спецификации. В шестнадцатеричном редакторе это дает: 3c 3f 78 6d

Я буферизирую свой XML-файл и добавляю спецификацию в начале:

char* BufferEncoder = (char*)malloc(3);
memset(BufferEncoder, 0, size);
for(int i=0;i<3;i++) BufferEncoder[i] ^= 0xaa;
BufferEncoder[0]=(char)0xef;
BufferEncoder[1]=(char)0xbb;
BufferEncoder[2]=(char)0xbf;
// concatenate into a new Buffer containing old xml and the BOM

Затем я попытался преобразовать UTF-8 с BOM в ISO 8859-1, используя следующие строки кода:

int size = WideCharToMultiByte(28591 /*ISO-8859-1*/, 0,  pBuffer, -1, NULL, 0, NULL, 0);
if (size>0)
{
    char* pBuffer2 = (char*)malloc(size);
    memset(pBuffer2, 0, sizeNew);
    WideCharToMultiByte(28591, 0,pBuffer,-1, pBuffer2, size, NULL, 0);
    // .........

Этот код еще не проверен. Как вы думаете, это лучшее решение? Любая идея или совет приветствуются. Заранее спасибо.


person Jawhar    schedule 23.06.2011    source источник
comment
Я ненавижу задавать этот вопрос, потому что ответ для всех ужасен: почему вы считаете, что должны преобразовывать текст из UTF-8? Кроме того, если WideCharToMultiByte делает то, что я думаю; вы используете неправильную функцию. UTF-8 не является широкой кодировкой символов; а ISO-8859-1 не является многобайтовым.   -  person Williham Totland    schedule 23.06.2011
comment
Спасибо за ответ. Мой XML-файл создается другим инструментом (TLC Simulink), и я не могу его контролировать. Функция загрузки IXMLDocument не может загрузить xml UTF-8 без спецификации, содержащей специальный символ.. по этой причине я должен преобразовать ее в UTF-8 со спецификацией, а затем в ISO 8859-1, иначе она не будет работать. Что такое правильная функция так? :)4   -  person Jawhar    schedule 23.06.2011
comment
Если это так; IXMLDocument непоправимо поврежден. Используйте другой инструмент обработки XML. В случае, если это не было разъяснено вам; правильный способ обработки XML-документа без объявления XML, указывающего кодировку и не дающего никаких других подсказок относительно того, какой может быть кодировка, - это рассматривать его как UTF-8 без BOM. Любой инструмент, который работает по-другому, называется «Делаем неправильно», и его нужно избегать и стыдить; и, возможно, нарисовано и четвертовано, если позволяют время и чувствительность.   -  person Williham Totland    schedule 24.06.2011


Ответы (1)


Как я уже упоминал в своем комментарии: я думаю, что этот ход мыслей требует, так сказать, нескольких вопросов прямо к вам:

  1. Почему вы делаете это преобразование в первую очередь?

  2. Вы действительно знаете, что делает WideCharToMultiByte()?

Я свободно признаю, что сам не совсем понимаю, что именно делает WideCharToMultiByte(); но я собираюсь пойти дальше и предположить, что он преобразует строку широких символов в строку многобайтовых символов. При беглом взгляде на документацию кажется, что она делает это в новом буфере, возвращая длину новой строки.

Что все хорошо и денди. Проблема в том, что UTF-8 на самом деле не является широкой кодировкой символов; а ISO-8859-1 не является многобайтовой кодировкой. UTF-8 является многобайтовой кодировкой; но в данном случае это мало поможет.

Мой совет; затем вы читали о кодировках символов; особенно о различиях между UTF-8 (многобайтная) и UTF-16 (широкая).

Я также предлагаю вам найти другой интерфейс для всего, что вы пытаетесь сделать, который фактически принимает строки UTF-8; потому что любой интерфейс, который требует строк ISO-8859-1, особенно при работе с XML, кажется мне безумно устаревшим, граничащим с полным безумием.

Конечно, если бы вы на самом деле заявили, чего вы в целом пытались достичь; можно дать более конкретный совет.

Изменить: Если я правильно понимаю вашу загадку, проблема в том, что вы получаете правильно отформатированный и закодированный файл XML, который может содержать символы вне диапазона ASCII (U+0…U+127). Если это проблема, использование ISO-8859-1 в любом виде, форме или форме настроит вас на мать всех головных болей в будущем:

Проблемы с кодировкой

Если текстовый файл может содержать какой-то символ за пределами диапазона ASCII, то он может содержать любой символ за пределами диапазона ASCII. И хотя UTF-8 может представлять любой символ, это не относится к ISO-8859-1.

Другими словами; ваш лучший сценарий, если вы придерживаетесь интерфейса, который неправильно обращается с кодировками, - это необратимая потеря информации; в худшем случае - авария и выгорание.

Моя точка зрения такова: не балуйте сломанный интерфейс и никогда не используйте UTF-8.

person Williham Totland    schedule 23.06.2011
comment
Я думаю, что моя проблема более проста: XML-файл, сгенерированный Simulink, если он закодирован в UTF-8 без спецификации, может содержать специальные символы, а затем IXMLDocument не может его загрузить. Новая версия Simulink теперь предлагает XML-файл, сгенерированный с помощью ISO 8859-1 и загружаемый правильно. Теперь моя проблема заключается в том, как загрузить мои старые файлы xml (utf8 без спецификации) и загрузить их, преобразовав их в iso 8859-1. Спасибо за ответ. Я не специалист по XML и кодированию. - person Jawhar; 24.06.2011
comment
@Jawhar: Повторюсь: никогда не используйте UTF-8. Я не могу не подчеркнуть этот момент достаточно. Из-за некоторых ужасных решений, сделанных в прошлом на основе предположений, которые оказались до головокружения ошибочными (например, стоимость места для хранения и передачи данных), вся проблема кодировки символов представляет собой полный беспорядок, но Unicode и UTF -8 в частности является сияющим маяком надежды в этом ужасном клубке ужасно неприятных ужасов. Проблема в том, что используемый вами интерфейс неисправен, и вам нужно научиться определять и обрабатывать правильный интерфейс и инструменты для обработки XML. 600. - person Williham Totland; 24.06.2011