gpt4 book ai didi

c++ - 无法使用 iconv 在编码之间进行转换

转载 作者:行者123 更新时间:2023-11-30 05:28:59 26 4
gpt4 key购买 nike

我正在尝试使用 iconv 将德语字符串转换为 UTF-16,但没有成功。这是它的代码:

#include <iconv.h>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <errno.h>

using namespace std;

const size_t BUF_SIZE=1024;

class IConv {
iconv_t ic_;
public:
IConv(const char* to, const char* from)
: ic_(iconv_open(to,from)) { }
~IConv() { iconv_close(ic_); }

bool convert(char* input, char* output, size_t& out_size) {
size_t inbufsize = strlen(input)+1;
return iconv(ic_, &input, &inbufsize, &output, &out_size);
}
};

int main(void)
{
char str1[BUF_SIZE] = "tägelîch";
char str2[BUF_SIZE] = "something else";
IConv ic("en_US.UTF-8","UTF16LE");
bool ret;

cout << str1 << endl;
size_t outsize = BUF_SIZE; //you will need it
ret = ic.convert(str1, str2, outsize);
if (ret == false) {
cout << "iconv failed: " << errno << endl;
return -1;
}
cout << str2 << endl;
}

输出:

$ ./a.out
tägelîch
something else

如果from编码类型改为ISO-8859-1,结果是一样的。

另一方面,iconv 实用程序在命令提示符下运行良好:

$ echo "TägelîcH" | iconv -f "ISO-8859-1" -t UTF-16LE
T▒▒gel▒▒cH

iconv --list 显示同时支持 ISO-8859-1UTF-16LE。我错过了什么?

C++ 是否以任何方式导致此行为?

谢谢!

最佳答案

没有。

不是 C++。

你的代码有很多问题。

1) 如果我没记错的话,你把输入代码和输出代码切换;与 ic("en_US.UTF-8","UTF16LE") (和 iconv_open(to,from) )您要求从“UTF16LE”转换为“en_US.UTF-8”;如果我理解得很好,你想要的恰恰相反

2) 我不知道在你的平台上,但我的 Debian iconv不支持“en_US.UTF-8”编码;试试 iconv --list看看是否iconv在你的平台上支持它

3) 你不测试是否 iconv_open(to,from)返回 iconv_t(-1) , 误差值

4) 你返回bool来自转换但iconv()返回 size_t ;如果出错,iconv()返回 size_t(-1)那,在 bool 中转换,成为 true (没有错误,如果我理解得很好的话)

5) 你没有测试传递给 convert() 的第三个参数的值;调用函数后应为零(或部分输入流未转换)

6) 当你初始化str1到“tägelîch”,你在 ISO-8859-1 中初始化它,而不是在 UTF-8 中

简单地说,如果我没记错的话,你传递的 to-encoding 不在 iconv 支持的编码列表中。 IConv 的构造函数类初始化cv_iconv_t(-1) (错误值)。当您调用 convert()方法,iconv()失败并返回 size_t(-1) (错误值)返回为 true (无错误值)convert() .

下面的代码并不完美,但我希望它能帮到你

#include <iconv.h>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <errno.h>

using namespace std;

const size_t BUF_SIZE=1024;

class IConv {

iconv_t ic_;

public:
IConv (const char* to, const char* from)
: ic_(iconv_open(to,from)) {
if ( iconv_t(-1) == ic_ )
throw std::runtime_error("error from iconv_open()");
}

~IConv ()
{ if ( iconv_t(-1) != ic_) iconv_close(ic_); }

bool convert (char* input, char* output, size_t& out_size) {
size_t inbufsize = strlen(input)+1;
return
(size_t(-1)
!= iconv(ic_, &input, &inbufsize, &output, &out_size))
&& (0U == inbufsize);
}
};

int main(void)
{
char str1[BUF_SIZE] = "tägelîch";
char str2[BUF_SIZE] = "something else";
IConv ic("UTF16LE", "ISO_8859-1");
bool ret;
size_t outsize = BUF_SIZE;

ret = ic.convert(str1, str2, outsize);
if (ret == false) {
cout << "iconv failed: " << errno << endl;
}
else {
cout << "outsize[" << outsize << "]\n";
cout << "str1[" << str1 << "]\n";
cout << "str2[" << str2 << "]\n";

for ( int i = 0 ; i < (BUF_SIZE - outsize) ; ++i )
if ( str2[i] )
cout << "str2[" << i << "]=[" << int(str2[i]) << "]("
<< str2[i] << ")\n";
}

return ret ? EXIT_SUCCESS : EXIT_FAILURE;
}

p.s.:抱歉我的英语不好。

关于c++ - 无法使用 iconv 在编码之间进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36595000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com