Преобразование XML-файла UTF-8 без спецификации в ISO 8859-1 - PullRequest
2 голосов
/ 23 июня 2011

У меня есть 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 с спецификацией 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);
    // .........

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

1 Ответ

1 голос
/ 23 июня 2011

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

  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.

...