簡體   English   中英

如何從UTF-16數組轉換為UTF-8字符串?

[英]How to convert from UTF-16 array to UTF-8 string?

我遇到一種情況,我收到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;
}

問題出在to_array 它不會產生uint16數組,而是一個指向指針的數組,其值設置為uint16值。 這是標准的帶框表示形式。 在Gee中似乎存在一個問題,即它無法生成正確類型的數組。 如果將數組更改為:

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

它工作正常。

暫無
暫無

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

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