C++ 从UTF-8到UTF-16 Big-endian的字符串转换失败(使用C,C+;+;语言)

C++ 从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

我使用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 = (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转换为