2010-09-15 42 views
5

我有一個簡單的問題,我無法在互聯網上找到任何地方,我如何在C語言中將UTF-8轉換爲ASCII(大部分帶重音的字符轉換爲無重音的相同字符)只使用標準庫?我找到了大多數語言的解決方案,但對於C尤其如此。UTF-8 - > C語言的ASCII碼

謝謝!

編輯:評論的一些善良的傢伙讓我仔細檢查我需要和我誇大。我只需要一個關於如何創建一個函數的想法:帶口音的字符 - >沒有口音的字符。 :)

+0

它不在標準庫中,所以你應該指定你真的需要這個工作的平臺。 – 2010-09-15 19:27:54

+0

可能是Linux。 – dccarmo 2010-09-15 20:13:46

+1

@dccarmo - C標準不是例如Posix標準。在Linux上可用,或者甚至由Posix授權,都不會使其成爲* C *標準庫。 – Steve314 2010-09-15 20:21:51

回答

2

有沒有建立這樣做的方式。 UTF-8和ASCII之間幾乎沒什麼區別,除非你談論的是高級字符,無論如何都不能用ASCII表示。

如果你有一個特定的映射你想要的(如帶有重音 - > a),那麼你應該可能只是把它作爲一個字符串替換操作。

+0

但是,當我嘗試做一個if(c =='á'){c ='a'; }它給了我「由於數據類型範圍有限,所以比較總是爲假」:( – dccarmo 2010-09-15 20:05:00

+0

@dccarmo:''看起來像''\ 0703 \ 0120''到C,所以這是一個大於一個'char'可以容納,所以如果'c'是一個char,就沒有辦法讓它等於它,它可能會等於'\ 0703',你流中的下一個字符就是' '\ 0120''。 – nategoose 2010-09-15 21:14:53

+0

@nategoose:刪除那些前導零;它們在C八進制字符轉義中無效,'\ 0703 \ 0120'被解析爲'\ 070','3','\ 012', 0'。 – 2010-09-15 22:17:54

5

看看libiconv。即使你堅持要在沒有圖書館的情況下這樣做,你也可能會在那裏找到靈感。

+0

我認爲違反了「僅使用標準庫」 – 2010-09-15 19:28:52

+0

@比利 - 如果只有一個人讀取libiconv源(例如複製代碼範圍),則不適用。 – Steve314 2010-09-15 19:57:28

+0

我來看看,謝謝! – dccarmo 2010-09-15 20:06:06

4

一般來說,你不能。 UTF-8涵蓋的不僅僅是重音字符。

2

每個體面的Unicode支持庫(當然不是標準庫)都有一種方法來分解KC或KD格式的字符串。它將字母和變音符分開。給你一個過濾出來的鏡頭。不太確定這是值得追求的,其結果對於母語讀者來說只是胡言亂語,並不是每個字母都可以分解。換句話說,帶有問號的垃圾。

+0

是的,我誇大了我的問題。我真的只想轉換重音字符 - >沒有口音的字符。我恨我的老師只允許我們用標準庫和C語言來完成這項工作。如果我只能使用Python。 :( – dccarmo 2010-09-15 20:12:50

+2

你選錯了班,不能幫你。 – 2010-09-15 20:20:26

2

由於這是功課,我猜你的老師是無法理解的,並且不知道UTF-8的任何內容,並且可能在20世紀80年代用「代碼頁」和「擴展ASCII」卡住了(你應該擦除的單詞從你的詞彙,如果你還沒有)。您的老師可能希望您編寫一個128字節的查找表,該表將映射範圍爲128-255的CP437或Windows-1252字節映射到類似外觀的ASCII字母。它會像...

void strip_accents(unsigned char *dest, const unsigned char *src) 
{ 
    static const unsigned char lut[128] = { /* mapping here */ }; 
    do { 
     *dest++ = *src < 128 ? *src : lut[*src]; 
    } while (*src++); 
}