2014-12-19 2 views
0

В моем приложении я хочу преобразовать строку, которая содержит символ ý, в UTF-8. Но это не дает точного результата. Я использую функцию WideCharToMultiByte, она преобразует чистоту символов в ½.Ошибка преобразования CString в UTF8 для «ý»

Для примера: Input - "ý" выход - "ý"

Пожалуйста, смотрите ниже код ..

String strBuffer("ý"); 
char *utf8Buffer = (char*)malloc(strBuffer.GetLength()+1); 
int utf8bufferLength = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)strBuffer.GetBuffer(strBuffer.GetLength() + 1)), 
strBuffer.GetLength(), utf8Buffer, strBuffer.GetLength() * 4,0,0); 

Пожалуйста, дайте ваши предложения ...

  • Binoy Krishna
+0

Поздравляем, это работает. Ваш отладчик не знает, что ваш char * содержит текст, закодированный utf8, вы должны сообщить ему. Используйте спецификатор формата s8. –

ответ

0

Uni Код для элемент кода письмаý, согласно this page составляет 253 или FD . Представление UTF-8 равно 195 189 десятичным или C3 BD шестнадцатеричным. Эти два байта можно рассматривать как буквыý в вашей программе и/или отладчик, но они UTF-8 числа, поэтому они байт, а не буквы.

Другими словами, вывод и код хороши, и ваши ожидания неверны. Я не могу сказать, почему они ошибаются, потому что вы не упомянули, что именно вы ожидали.

EDIT: код должен быть улучшен. См. Ответ Рудольфа.

+0

Большое спасибо Dialecticus ... –

0

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

1) вы должны использовать _T() макросъемки при инициализации строки : CString strBuffer(_T("ý")); Макрос _T() определяется в tchar.h и отображает нужный тип строки в зависимости от значения макроса _UNICODE.

2) не использовать GetLength() для вычисления размера буфера UTF-8, смотрите документацию WideCharToMultiByte в MSDN, он показывает, как использовать функцию для расчета необходимой длины для буфера UTF-8 в комментарии.

Вот небольшой пример, который проверяет выход в соответствии с кодовых и показывает, как использовать автоматический расчет длины:

#define _AFXDLL 
#include <afx.h> 

#include <iostream> 

int main(int argc, char** argv) 
{ 
    CString wideStrBuffer(_T("ý")); 
    // The length calculation assumes wideStrBuffer is zero terminated 
    CStringA utf8Buffer('\0', WideCharToMultiByte(CP_UTF8, 0, wideStrBuffer.GetBuffer(), -1, NULL, 0, NULL, NULL)); 
    WideCharToMultiByte(CP_UTF8, 0, wideStrBuffer.GetBuffer(), -1, utf8Buffer.GetBuffer(), utf8Buffer.GetLength(), NULL, NULL); 
    if (static_cast<unsigned char>(utf8Buffer[0]) == 195 && static_cast<unsigned char>(utf8Buffer[1]) == 189) 
    { 
     std::cout << "Conversion successful!" << std::endl; 
    } 
    return 0; 
} 
+0

Большое спасибо Rudolfs .. –

Смежные вопросы