C++ 从UTF-8到UTF-16 Big-endian的字符串转换失败(使用C,C+;+;语言)
我使用g_convert()glib函数将utf-8字符串转换为utf-16大端字符串。转换失败。我们收到一个错误,提示“不支持转换” 有没有人能提供一个解决这个问题的线索 谢谢 下面是用于从UTF-8转换字符串的代码段。到UTF16 BigendianC++ 从UTF-8到UTF-16 Big-endian的字符串转换失败(使用C,C+;+;语言),c++,c,utf-8,glib,utf-16,C++,C,Utf 8,Glib,Utf 16,我使用g_convert()glib函数将utf-8字符串转换为utf-16大端字符串。转换失败。我们收到一个错误,提示“不支持转换” 有没有人能提供一个解决这个问题的线索 谢谢 下面是用于从UTF-8转换字符串的代码段。到UTF16 Bigendian unsigned short *result_str; gsize bytes_read, bytes_written; gssize len = 0; GError *error = NULL; result_str = (unsig
unsigned short *result_str;
gsize bytes_read, bytes_written;
gssize len = 0;
GError *error = NULL;
result_str = (unsigned short *)g_convert("text data", len, "UTF-16BE", "UTF-8", &bytes_read, &bytes_written, &error);
我怀疑
g_convert
不支持UTF-16BE
(基于错误消息)。不过,将UTF-8转换为UTF-16BE很简单(没有表或其他类似的垃圾)——您可以自己进行转换
您可能还需要检查是否支持
UTF-16
,并在必要时进行自己的字节交换。但是我也不相信g\u convert
支持UTF-16
。我怀疑g\u convert
不支持UTF-16BE
(基于错误消息)。不过,将UTF-8转换为UTF-16BE很简单(没有表或其他类似的垃圾)——您可以自己进行转换
您可能还需要检查是否支持
UTF-16
,并在必要时进行自己的字节交换。但是我也不相信g\u convert
支持UTF-16
。您len
是0。GLib说对于以空结尾的字符串,len
必须为-1。您的len
为0。GLib说对于以NULL结尾的字符串,len
必须为-1。看起来您的系统不支持这种转换。(此错误意味着iconv()返回了EINVAL。)
在我的Linux系统上,似乎确实支持:
echo "Hello" | iconv --from-code UTF-16BE --to-code UTF-8
(显然,“Hello”不是一个有效的UTF-16字符串,但它确实会被转换成某些东西,因此实际的转换似乎是受支持的)
查看是否有UTF-16BE在“iconv--列表”中
在这种情况下,最简单的解决方案可能是只使用g_utf8_to_utf16()
您可以轻松完成自己的byteswap,未经测试的代码:
if (G_BYTE_ORDER != G_BIG_ENDIAN) {
for (i = 0; i < len; ++i) {
result_str[i] = GUINT16_TO_BE(result_str[i]);
}
}
if(G_字节顺序!=G_大字节顺序){
对于(i=0;i
看起来您的系统不支持该转换。(此错误意味着iconv()返回了EINVAL。)
在我的Linux系统上,似乎确实支持:
echo "Hello" | iconv --from-code UTF-16BE --to-code UTF-8
(显然,“Hello”不是一个有效的UTF-16字符串,但它确实会被转换成某些东西,因此实际的转换似乎是受支持的)
查看是否有UTF-16BE在“iconv--列表”中
在这种情况下,最简单的解决方案可能是只使用g_utf8_to_utf16()
您可以轻松完成自己的byteswap,未经测试的代码:
if (G_BYTE_ORDER != G_BIG_ENDIAN) {
for (i = 0; i < len; ++i) {
result_str[i] = GUINT16_TO_BE(result_str[i]);
}
}
if(G_字节顺序!=G_大字节顺序){
对于(i=0;i
g\U convert在封盖下面使用iconv
在我的机器上使用cygwim我可以
iconv -l
其中列出了支持的编码,UTF-16BE确实出现在列表中,但是:-
$ iconv -l | grep BE
UCS-2BE UNICODE-1-1 UNICODEBIG CSUNICODE11
UCS-4BE
UTF-16BE
UTF-32BE
James@XPL3KWK28 ~
$ iconv -f UTF-8 -t UTF16-BE
iconv: conversion to UTF16-BE unsupported
iconv: try 'iconv -l' to get the list of supported encodings
如您所见,它不支持与UTF-8之间的转换
您可能需要分两个阶段执行此操作:UTF-8到UTF-16,然后是UTF-16到UTF-16BE。g\U convert在封盖下面使用iconv 在我的机器上使用cygwim我可以
iconv -l
其中列出了支持的编码,UTF-16BE确实出现在列表中,但是:-
$ iconv -l | grep BE
UCS-2BE UNICODE-1-1 UNICODEBIG CSUNICODE11
UCS-4BE
UTF-16BE
UTF-32BE
James@XPL3KWK28 ~
$ iconv -f UTF-8 -t UTF16-BE
iconv: conversion to UTF16-BE unsupported
iconv: try 'iconv -l' to get the list of supported encodings
如您所见,它不支持与UTF-8之间的转换
您可能需要分两个阶段执行此操作:UTF-8到UTF-16,然后是UTF-16到UTF-16BE。我不熟悉它,但作为一个实际解决方案,如何将其转换为小端UTF-16,然后仅进行字节交换?或者,查找utf-8编码算法,例如Wikipedia。有时,DIY比让别人的代码工作起来更容易。:-)你能发布一段最小的代码来说明你遇到的问题吗?问题有很多可能的原因,用一小段代码来显示问题有助于消除一些可能性。我总是想知道这些人想转换成UTF-16。你可能会认为他们中的大多数人都想走另一条路:毕竟,你在UTF-8中看到多少网页?现在UTF-16中有多少?”我不熟悉它,但作为一个实际的解决方案,转换成小端utf-16,然后仅仅进行字节交换怎么样?或者,查找utf-8编码算法,例如Wikipedia。有时,DIY比让别人的代码工作起来更容易。:-)你能发布一段最小的代码来说明你遇到的问题吗?问题有很多可能的原因,用一小段代码来显示问题有助于消除一些可能性。我总是想知道这些人想转换成UTF-16。你可能会认为他们中的大多数人都想走另一条路:毕竟,你在UTF-8中看到多少网页?现在UTF-16中有多少?”“iconv--list”在我的系统上有UTF-16BE实际上有2个:UTF-16BE,UTF16BE。这两种拼法有什么区别吗?我怀疑这两种拼法有什么区别。可能iconv支持编码,但不支持从UTF-8转换,或者您的glib或C库安装存在其他问题。如果您发布一个小的可编译测试用例,人们可以在他们的系统上尝试,并让您知道此问题是否特定于您的系统。“iconv--列表”我的系统上有UTF-16BE吗实际上有2个:UTF-16BE,UTF16BE。这两种拼法有什么区别吗?我怀疑这两种拼法有什么区别。也许iconv支持编码,但不支持UTF-8的转换,或者您的glib或C库安装可能还有其他问题。如果您发布了一个小的可编译测试用例,人们可以在他们的系统上尝试它,并让您知道此问题是否特定于您的系统。iconv-l | grep BE EBCDIC-BE//EBCDIC-CP-BE//UCS-2BE//UCS-4BE//UTF-16BE//UTF-32BE//UTF16BE//UTF32BE//UTF32BE//其支持从UTF-8转换为