2017-09-02 57 views
1

對於我目前正在使用的應用程序,我需要從二進制文件中讀取UTF-8編碼的字符串。這些字符串不是以null結尾的,而是以一個指定其長度的字節開頭。Vala:從不能識別多字節字符的字節中讀取UTF-8字符串

當我嘗試讀取這樣的字符串時,所有多字節UTF-8字符都變爲?。查找下面的樣本:

public void main(string[] args) { 
    File file = File.new_for_path("test.bin"); 
    DataInputStream instream = new DataInputStream(file.read()); 
    uint8[] chars = new uint8[instream.read_byte()]; 
    instream.read(chars); 
    print(@"$((string) chars)\n"); 
} 

這當然是一個剝離的樣本。有問題的實際二進制文件是加密的,這並不反映在這裏。如果我用包含以UTF-8字節長度開頭的字節序列09 52 C3 AD 61 73 74 72 61 64Ríastrad的樣本文件test.bin來使用它。期望的輸出是Ríastrad,但實際輸出是R?astrad

任何人都可以闡明這個問題,也許是一個解決方案?

回答

1

您需要添加Intl.setlocale();到您的代碼:

public void main(string[] args) { 
    Intl.setlocale(); 
    File file = File.new_for_path("test.bin"); 
    DataInputStream instream = new DataInputStream(file.read()); 
    uint8[] chars = new uint8[instream.read_byte()]; 
    instream.read(chars); 
    print(@"$((string) chars)\n"); 
} 

的缺省語言環境爲print()是C語言環境,這是美國ASCII。美國ASCII字符範圍之外的任何字符均以?的形式呈現。使用Intl.setlocale();將區域設置設置爲與運行程序的機器相同。

+0

非常感謝 - 這正是我所需要的!我完全專注於事物的一面,而完全忽略了另一面,在這種情況下更重要的一面。我不會再犯錯了! – aabryant