簡體   English   中英

從UTF-8到UTF-16大字節序的字符串轉換失敗(使用C,C ++語言)

[英]String conversion from UTF-8 to UTF-16 Big endian is failing (using C, C++ language)

我正在使用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);

len為0。GLib 手冊說,對於以NULL結尾的字符串, len必須為-1。

g_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_convert不支持UTF-16BE (基於錯誤消息)。 但是,將UTF-8轉換為UTF-16BE並不容易(沒有任何表或類似的垃圾),您可以自己進行轉換。

您可能還需要檢查是否支持UTF-16 ,並在需要時進行自己的字節交換。 但是我也不相信g_convert支持UTF-16

看來您的系統不支持該轉換。 (此錯誤意味着iconv()返回EINVAL。)

在我的Linux系統上,它確實受到支持:

echo "Hello" | iconv --from-code UTF-16BE --to-code UTF-8

(顯然,“ Hello”不是有效的UTF-16字符串,但確實會轉換為某種形式,因此似乎支持實際的轉換)

查看“ iconv --list”中是否有UTF-16BE

在這種情況下,最簡單的解決方案可能是只使用g_utf8_to_utf16(): http ://library.gnome.org/devel/glib/stable/glib-Unicode-Manipulation.html#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]);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM