我有一個簡單的問題,我無法在互聯網上找到任何地方,我如何在C語言中將UTF-8轉換爲ASCII(大部分帶重音的字符轉換爲無重音的相同字符)只使用標準庫?我找到了大多數語言的解決方案,但對於C尤其如此。UTF-8 - > C語言的ASCII碼
謝謝!
編輯:評論的一些善良的傢伙讓我仔細檢查我需要和我誇大。我只需要一個關於如何創建一個函數的想法:帶口音的字符 - >沒有口音的字符。 :)
我有一個簡單的問題,我無法在互聯網上找到任何地方,我如何在C語言中將UTF-8轉換爲ASCII(大部分帶重音的字符轉換爲無重音的相同字符)只使用標準庫?我找到了大多數語言的解決方案,但對於C尤其如此。UTF-8 - > C語言的ASCII碼
謝謝!
編輯:評論的一些善良的傢伙讓我仔細檢查我需要和我誇大。我只需要一個關於如何創建一個函數的想法:帶口音的字符 - >沒有口音的字符。 :)
有沒有建立這樣做的方式。 UTF-8和ASCII之間幾乎沒什麼區別,除非你談論的是高級字符,無論如何都不能用ASCII表示。
如果你有一個特定的映射你想要的(如帶有重音 - > a),那麼你應該可能只是把它作爲一個字符串替換操作。
但是,當我嘗試做一個if(c =='á'){c ='a'; }它給了我「由於數據類型範圍有限,所以比較總是爲假」:( – dccarmo 2010-09-15 20:05:00
@dccarmo:''看起來像''\ 0703 \ 0120''到C,所以這是一個大於一個'char'可以容納,所以如果'c'是一個char,就沒有辦法讓它等於它,它可能會等於'\ 0703',你流中的下一個字符就是' '\ 0120''。 – nategoose 2010-09-15 21:14:53
@nategoose:刪除那些前導零;它們在C八進制字符轉義中無效,'\ 0703 \ 0120'被解析爲'\ 070','3','\ 012', 0'。 – 2010-09-15 22:17:54
一般來說,你不能。 UTF-8涵蓋的不僅僅是重音字符。
每個體面的Unicode支持庫(當然不是標準庫)都有一種方法來分解KC或KD格式的字符串。它將字母和變音符分開。給你一個過濾出來的鏡頭。不太確定這是值得追求的,其結果對於母語讀者來說只是胡言亂語,並不是每個字母都可以分解。換句話說,帶有問號的垃圾。
是的,我誇大了我的問題。我真的只想轉換重音字符 - >沒有口音的字符。我恨我的老師只允許我們用標準庫和C語言來完成這項工作。如果我只能使用Python。 :( – dccarmo 2010-09-15 20:12:50
你選錯了班,不能幫你。 – 2010-09-15 20:20:26
由於這是功課,我猜你的老師是無法理解的,並且不知道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++);
}
它不在標準庫中,所以你應該指定你真的需要這個工作的平臺。 – 2010-09-15 19:27:54
可能是Linux。 – dccarmo 2010-09-15 20:13:46
@dccarmo - C標準不是例如Posix標準。在Linux上可用,或者甚至由Posix授權,都不會使其成爲* C *標準庫。 – Steve314 2010-09-15 20:21:51