Как сделать так, чтобы iconv делал преобразования в кодировки UTF- * без добавления метки порядка байтов?
Проблема показана в следующем коде, скомпилированном с G ++ 4.8 под 64-битным Linux:
#include <iostream>
#include <iconv.h>
#include <cstdint>
#include <iomanip>
using namespace std;
int main() {
const wchar_t *ws = L"Hello, world.\n";
for(size_t ii = 0; ii < 15; ii++) {
cout << setw(2) << hex << uint32_t(ws[ii]) << " ";
}
cout << endl;
iconv_t conv = iconv_open("UTF-16", "UTF-32");
char *outbuf = new char[14 * 4];
char *inptr = const_cast<char*>(reinterpret_cast<const char *>(ws));
char *outptr = outbuf;
size_t in_len = 14 * 4;
size_t out_len = 14 * 4;
size_t result = iconv(conv, &inptr, &in_len, &outptr, &out_len);
uint16_t *encoded = reinterpret_cast<uint16_t*>(outbuf);
for(size_t ii = 0; ii < 15; ii++) {
cout << setw(2) << hex << encoded[ii] << " ";
}
cout << endl;
}
Это выводит:
48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 2e a 0
feff 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 2e a
ясно показывает спецификацию в начале результирующей строки, где она отсутствует в
Я обнаружил, что это работает для меня:
iconv_t conv = iconv_open("UTF16LE", "UTF32");
Хотя я считаю, что это зависит от реализации.
Есть похожий вопрос: Использование iconv для преобразования из UTF-16BE в UTF-8 без спецификации