Member 13323088 Ответов: 1

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


введите несколько японских букв в мой QR-код. в моем конечном результате я не могу получить все, что я дал "12345、エンドコード、6789", но частичный вывод(12345、) будет иметь get.remain часть не будет me.can кто-нибудь помочь мне получить полный ввод в моем конечном результате.

Что я уже пробовал:

использование метода преобразования UTF-8 multibytetowidechar.

std::string &output;
std::string stval((LPCSTR)Out);
std::wstring convertedstring;
int Reqsize = MultiByteToWideChar(CP_UTF8, 0, stval.c_str(), -1, 0, 0);
if (Reqsize > 0)
{
std::vector<wchar_t>bufferString(Reqsize);
MultiByteToWideChar(CP_UTF8, 0, stval.c_str(), -1, &bufferString[0], Reqsize);
convertedstring.assign(bufferString.begin(), bufferString.end() - 1);
}

const wchar_t* szText= convertedstring.c_str();
char *str = новый символ[1024];
sprintf(str,"%ls", szText);
srtzsie реализация = convertedstring.размер();

здесь str получит только 12345、, наконец,я использую output.append(str, srtzsie); ,чтобы показать выход. я хочу показать полный ввод в моей выходной части.

заранее спасибо.

Richard Deeming

Репост
Вы уже опубликовали это сообщение:
https://www.codeproject.com/Questions/1254085/How-to-get-I-encoded-japanese-latter-in-my-QR-appi[^]

Если вы хотите обновить свой вопрос, Нажмите зеленую ссылку "улучшить вопрос" и отредактируйте свой вопрос. НЕ опубликуйте обновление как новый вопрос.

1 Ответов

Рейтинг:
1

Jochen Arndt

Проблема находится в этих строках:

const wchar_t* szText= convertedstring.c_str();
char *str = new char[1024];
sprintf(str,"%ls", szText);
Здесь вы преобразуете широкую строку символов в многобайтовую используя текущую кодовую страницу с помощью sprintf с форматом %ls Все символы, не поддерживаемые текущей кодовой страницей, не будут показаны позже при печати строки.

Забудьте об использовании многобайтовых строк для взаимодействия с пользователем в настоящее время. Они даже преобразуются обратно в широкие строки при вызове функций Windows API, потому что Windows использует Unicode внутренне уже почти двадцать лет.

Ваш код также слишком сложен. Если это в кодировке UTF-8 LPCSTR или LPSTR:
//std::wstring convertedstring;
int reqsize = ::MultiByteToWideChar(CP_UTF8, 0, Out, -1, NULL, 0);
if (reqsize > 0)
{
    wchar_t *wide = new wchar_t[reqsize];
    ::MultiByteToWideChar(CP_UTF8, 0, Out, -1, wide, reqsize);
    // Use wide here for output

    // Optionally assign it to convertedstring
    //convertedstring = wide;
    delete[] wide;
}


Member 13323088

в моей результирующей части я получаю только "0", а не на вышеупомянутых значениях.
в "результате.дописать((константный тип char*)convertedstring.c_str());"значения результата извлечения части и это место всегда получить "0". как я могу получить вывод на эту часть.

Jochen Arndt

result.append((const char*)convertedstring.c_str()); это не входит в мое решение.

Вы знаете, что делает эта линия?
Очевидно, нет. Никогда не используйте гипс, если вы не знаете, что делаете. Актеры не конвертируют данные!

convertedstring-это широкая строка символов. В вашем примере строки первая буква - "1". Код ASCII этой буквы-0x31. Код Unicode (UTF-16, wide char code) этой буквы равен 0x0031. Если вы приведете и назначите широкий указатель char указателю char, который будет указывать на строку char с первыми двумя байтами 0x31 и 0x00. Если вы напечатаете эту строку, она просто покажет символ "1", потому что следующий символ-NULL, который является символом завершения строки.

Опять же: если вам нужно отобразить символы из нескольких языков, используйте Unicode. Преобразование Юникода в многобайтовый код не будет работать для символов, не охваченных текущей кодовой страницей.

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