Преобразование из расширенного ascii в utf8

Как преобразовать std::string, закодированный в расширенном ascii, в utf8 с помощью Microsoft Visual Studio 2005?

Я использую буфер протокола Google, и он жалуется на символы, отличные от utf8, в моей строке, если я даю его без преобразования, что верно...


person foke    schedule 09.09.2010    source источник
comment
Что вы подразумеваете под расширенным ASCII?   -  person Rowland Shaw    schedule 09.09.2010
comment
Нет такой вещи, как расширенный ASCII. Сначала вам нужно узнать кодировку (например, ISO 8859-1, также известную как Latin-1, или какую-то кодовую страницу Windows).   -  person DarkDust    schedule 09.09.2010
comment
en.wikipedia.org/wiki/Extended_ASCII Наверное, я говорю о ISO-8859- 1   -  person foke    schedule 09.09.2010
comment
Откуда взялась струна? Вы должны определить границы, в которых происходит преобразование символов. Внутренне все строки должны быть определенного формата (и, кажется, вам нужен UTF-8), поэтому любой ввод в ваш код также должен быть UTF-8 (или автоматически конвертироваться методом ввода). Итак, вопрос в том, откуда берется недезинфицированная строка?   -  person Martin York    schedule 09.09.2010


Ответы (2)


Используйте MultiByteToWideChar, чтобы преобразовать строку в UTF. -16, затем используйте WideCharToMultiByte для преобразования это в UTF-8.

person sbi    schedule 09.09.2010
comment
@Andrey: В прошлый раз, когда я изучал проблему (которую я честно признаю давно), я не нашел другого пути, кроме маршрута через UTF-16. - person sbi; 09.09.2010
comment
Символы ASCII с кодом › 127 недействительны с точки зрения UTF-8. а MultiByte означает UTF-8. это не сработает, говорю вам, просто попробуйте. может быть, вы (или я :)) неправильно поняли вопрос. - person Andrey; 09.09.2010
comment
@Andrey: MultiByteToWideChar() также может преобразовывать системный текст в UTF-16. В этом ли причина нашего непонимания? TTBOMK, это все, что Win32 API предлагает для преобразования между системной кодировкой и UTF-8. - person sbi; 09.09.2010
comment
@ Андрей, MultiByteToWideChar может конвертировать из многих кодовых страниц, а не только из UTF-8. На это указывает его первый параметр. - person Rob Kennedy; 09.09.2010
comment
@sbi вы правы, это сработает, если вы передадите 1252 в качестве кодовой страницы, но все же мне нравится мой метод, он быстрее :) - person Andrey; 09.09.2010

Предположим, что загадочный расширенный ASCII — это просто Latin1. Затем используйте маску из Википедии:

110 лет ггхх 10хх хххх

Поскольку у вас есть только 00..FF, то у вас есть: 1100 00xx 10xx xxxx.

Алгоритм преобразования будет следующим: если код символа ‹ 127, просто выгрузите его как есть, если он> 127, то вы делаете 0xC0 | ((x & 0xC0) >> 24), переходите к первому байту, второму - ((x & 0x3F) | 0x80)

person Andrey    schedule 09.09.2010
comment
О какой маске из Википедии идет речь? Вы также не сгенерировали допустимый UTF-8; В UTF-8 нет нулевых байтов. - person Rob Kennedy; 09.09.2010