2012-07-09 47 views
1

characters.txt具有內容(從OD -c輸出):Unix:爲什麼在C中讀取寬字符後停止ASCII?

0000000 % ( ) * + , - . / 0 1 2 3 4 5 6 
0000020 7 8 9 < = > ? [ ] \n A B C D E F 
0000040 G H I J K L M N O P Q R S T U V 
0000060 W X Y Z \n a b c d e f g h i j k 
0000100 l m n o p q r s t u v w x y z \n 
0000120 316 223 316 224 316 230 316 233 316 236 316 243 316 246 316 250 
0000140 316 251 316 261 316 262 316 263 316 264 316 265 316 266 316 267 
0000160 316 270 316 271 316 272 316 273 316 274 316 275 316 276 316 277 
0000200 317 200 317 201 317 202 317 203 317 204 317 205 317 206 317 207 
0000220 317 210 317 211 \n 

也就是說,一些ASCII隨後一些希臘在UTF-8。我想讀這些字符(在glibc的info頁給出的例子後,寫了下面的)

wint_t* read_characters() { 
    char *filename = "characters.txt"; 
    FILE *infile; 
    infile = fopen (filename, "rb"); 
    printf ("File orientation: %d\n", fwide (infile,0)); 
    static wint_t b[16384], c, *p; 
    p = b; 
    while ((p-b)<sizeof(b)-4 && (c = fgetwc (infile)) != WEOF) 
     *p++ = c; 
    *p++ = WEOF; 
    printf("\nRead %ld wint_t chars from characters.txt\n", p-b); 
    return b; 
} 

輸出是:

文件方向:0 閱讀81所述wint_t從文字字符.txt

這意味着閱讀停止了第一個希臘字符。爲什麼?我沒有使用可能僞造WEOF的簽名變量。誰可以幫忙?

+0

什麼「一些希臘語代碼頁UTF-8」? Codepages和UTF-8屬於不同的世界。並且不'fgetwc'假定UTF-16或UTF-32,而不是UTF-8? – 2012-07-09 17:16:10

+1

http://www.gnu.org/software/libc/manual/html_node/Setting-the-Locale.html – 2012-07-09 17:17:06

+1

的確,這是缺少對setlocale的調用。有趣的是,LC_ALL已經設置爲en_US.UTF-8,但需要重新從程序中設置,因爲看起來似乎。非常感謝! – rwst 2012-07-09 17:42:27

回答

1

該解決方案(在由N.M.暗示)是包含此調用

setlocale(LC_ALL, "en_US.UTF-8"); 

,這是必要的,即使LC_ALL是全球設置,因爲C程序總是在「C」語言環境中啓動了。如果你想使用別的東西,你總是需要設置它。

相關問題