【问题标题】:How to convert from UTF-16 array to UTF-8 string?如何从 UTF-16 数组转换为 UTF-8 字符串?
【发布时间】:2015-08-24 20:24:40
【问题描述】:

我遇到一种情况,我收到 UTF-16 代码点(一次一个)。所以我将它们收集在一个列表中,然后将列表转换为一个数组。

这给我留下了uint16[],但GLib.convert () 需要一个字符串:

int main () {
    var utf16data = new Gee.ArrayList<uint16> ();

    utf16data.add ('A');
    utf16data.add (0xD83C);
    utf16data.add (0xDC1C);

    var utf16array = utf16data.to_array ();

    try {
        // convert expects a string here
        var s = convert (utf16array, utf16data.size * 2, "UTF-8", "UTF-16LE");
        stdout.printf ("%s\n", s);
    } 
    catch (ConvertError e) {
        stderr.printf (@"error: $(e.message)\n");
    }

    return 0;
}

那么如何将 UTF-16 数组转换为 UTF-8 字符串呢?

更新

我试图只转换数组:

int main () {
    var utf16data = new Gee.ArrayList<uint16> ();

    utf16data.add ('A');
    utf16data.add (0xD83C);
    utf16data.add (0xDC1C);
    // utf16data.add (0);

    var utf16array = utf16data.to_array ();

    try {
        size_t bytes_read;
        size_t bytes_written;
        var s = convert ((string) utf16array, utf16data.size * 2, "UTF-8", "UTF-16LE", out bytes_read, out bytes_written);
        stdout.puts (@"bytes_read = $bytes_read\n");
        stdout.puts (@"bytes_written = $bytes_written\n");
        stdout.puts (@"s.length = $(s.length)\n");
        // Should print "A????", but the Unicode symbol is not printed
        stdout.puts (@"s = $s\n");
    } 
    catch (ConvertError e) {
        stderr.printf (@"error: $(e.message)\n");
    }

    return 0;
}

现在至少“A”被写入标准输出,但 Unicode 符号不是。

bytes_read = 6
bytes_written = 3
s.length = 1
s = A

在这种情况下将数组转换为字符串是否正确?

为什么没有转换Unicode符号?

更新 2

这是我现在解决的代码:

int main () {
    var utf16data = new Gee.ArrayList<uint16> ();

    utf16data.add ('A');
    utf16data.add (0xD83C);
    utf16data.add (0xDC1C);

    // Replacement for 
    // utf16array = utf16data.to_array;
    uint16[] utf16array = new uint16[utf16data.size];
    for (int i = 0; i < utf16data.size; i++)
        utf16array[i] = utf16data[i];

    try {
        var s = convert ((string)utf16array, utf16array.length * 2, "UTF-8", "UTF-16LE");
        stdout.puts (@"$s\n");
    } 
    catch (ConvertError e) {
        stderr.puts (@"error: $(e.message)\n");
    }

    return 0;
}

【问题讨论】:

  • 您确定这些值是 bytes,而不是 characters 之类的吗? (鉴于 Java 的字符串处理,可能会“方便地”存储,而不是作为文字字节。免责声明:这 -> · 两个代码应该代表一个字符。它是否适用于更简单的字形?
  • @Jongware utf16data 数组很好,我认为我的演员阵容破坏了这里的一切。它甚至不适用于“A”、“B”、“C”输入。我必须弄清楚如何将 UTF-16 数据放入 convert () 方法中。顺便说一句,这是 Vala 而不是 Java。 (不同的语言)

标签: arrays unicode encoding glib vala


【解决方案1】:

问题在于to_array。它不会产生uint16 的数组,而是一个指向指针的数组,其值设置为uint16 值。这是标准的盒装表示。 Gee 中似乎存在一个问题,即它没有生成正确类型的数组。如果将数组更改为:

uint16[] utf16array = {'A', 0xD83C, 0xDC1C};

效果很好。

【讨论】:

  • 知道如何动态添加值吗?我刚试了GLib.Array&lt;uint32&gt;,也不管用。
  • 好的,我没有使用效率不高的简单循环,但它可以工作(请参阅我对问题的更新)。
  • 你可以在 Vala 中使用 += 动态扩展一个数组,只要它是一个局部变量或一个私有字段。
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 2014-02-22
相关资源
最近更新 更多