2016-05-19 19 views
0

У меня есть строка Unicode, содержащая четыре японских символа, и я использую WideCharToMultiByte, чтобы преобразовать ее в многобайтную строку с указанием кодовой страницы Shift-JIS 932. Чтобы получить размер требуемого буфера, я вызываю WideCharToMultiByte сначала с параметром cbMultiByte, установленным в 0. Это возвращает 9, как ожидалось, но затем, когда я действительно вызываю WideCharToMultiByte снова, чтобы сделать преобразование, он возвращает число байт записывается как 13. в качестве примера ниже, я в настоящее время жесткого кодирования мой размер буфера до 100:WideCharToMultiByte - требуемый размер и байты, написанные, различны для кодовой страницы Shift-JIS

BSTR value = SysAllocString(L"日経先物"); 
char *buffer = new char[100]; 

int sizeRequired = WideCharToMultiByte(932, 0, value, -1, NULL, 0, NULL, NULL); 

// sizeRequired is 9 as expected 

int bytesWritten = WideCharToMultiByte(932, 0, value, sizeRequired, buffer, 100, NULL, NULL); 

// bytesWritten is 13 

буфер [8] содержит строку терминатор \ 0, как и ожидалось. buffer [9-12] содержит байт 63.

Итак, если я задал размер моего буфера как sizeRequired, он слишком мал, а второй вызов WideCharToMultiByte терпит неудачу. Кто-нибудь знает, зачем записываются дополнительные 4 байта с байтом, равным 63?

ответ

3

Вы передаете неправильные аргументы WideCharToMultiByte во втором вызове (требуемый размер места назначения в качестве длины источника). Вам нужно изменить

int bytesWritten = WideCharToMultiByte(932, 0, value, sizeRequired, buffer, 100, 
             NULL, NULL); 

в

int bytesWritten = WideCharToMultiByte(932, 0, value, -1, buffer, sizeRequired, 
             NULL, NULL); 
+0

Это также имеет смысл не выделить 'символ []' не буфер до тех пор, после первого вызова вычислили размер, для 'char' рассчитывать так вы не теряете ненужную память без необходимости: 'char * buffer; int sizeRequired = ...; buffer = new char [sizeRequired]; int bytesWritten = ...; ... delete [] buffer; 'Кроме того,' BSTR' необходимо освободить с помощью 'SysFreeString()', но поскольку 'BSTR' выделяется из строкового литерала, имеет смысл иметь значение' value' просто укажите прямо буквально: 'LPCWSTR value = L" 日 経 先 物 ";' –