2014-05-12 59 views
1

背景變音符號的字符或字符串

進出口工作在一些嵌入式項目,我試着去處理非標字符和字體。

我有600 +元素數組中的原始位圖字體。該數組的每5個元素都包含一個字符。我在前5個元素中有字符32(空格),在6-10個元素中有33個字符(!)等。

我必須處理國家變音字符(例如「è」)。我找到他們後122個字符。現在我試圖重新映射字符,以便在C源代碼中輸入print("Test ę");時獲得正確的字符。

問題

所以我想在源這樣鍵入:

print("Test diactric ę"); 
// warning: (228) illegal character (0xC4) 

當我嘗試這個(我想看看代碼C將把爲「E」):

int a = 'ę'; 
// error: (226) char const too long 

如何解決此問題?

即時通訊使用XC8編譯器(基於gcc的?)。

我在編譯器手冊中發現,它使用7位字符編碼,但也許有一些方法?我的源文件使用UTF-8編碼。

編輯

貌似wchar.h通過Emilien建議能爲我工作,但遺憾的是我沒有編譯wchar.h。

也許一些預處理技巧?我真的想避免鐵桿文本編寫這樣的:

print("abcde"); 
print_diactric(123); // 123 code used for ę 
print("fgh"); 

// to get "abcdeęf" "word" 
+0

甲'char'只是一個小'1字節的大小int';它只能保存256個不同的值(0〜255,-128〜+127等)。除了英文文本以外,您還需要某種多字節字符/字符串(例如Unicode)。 –

+0

@NicolasMiari說'它只是一個小的'int'「是不正確的,因爲'int'是有符號的,'char'的符號更復雜。它可以是。 – unwind

+0

你有什麼理由試圖重塑這個特殊的輪子? –

回答

2

你需要想想源編碼(聽起來一樣,使用你的C源文件系統所在的字符編碼之間的差異編譯器運行)和目標編碼,這是編譯器假定代碼將運行的系統的編碼。

如果你的編譯器的目標編碼是「7位」,那麼沒有標準的方式來表達一個像è這樣的字符,它不是目標字符集的一部分。你將不得不解決這個問題,也許通過自己從其他格式實現編碼。

+1

對於128-255範圍內的字符,可以使用十六進制代碼,例如'\ xE2' –

+0

這應該工作,但OP還需要創建一個從UTF8(輸入格式)到輸出格式(「600+」位圖表中的2字節索引)的轉換表。根據* output *字符的範圍,對Unicode值使用線性列表(對於連續代碼)或二進制表(對於更多隨機字符)。 – usr2564301

1

正如解開所解釋的,爲了對這些字符進行編碼,您需要超過7位,也許您可​​以使用the wide character type

#include <wchar.h> 
#include <stdio.h> 

int main(){ 
    printf("%s\n", "漢語"); 
    printf("%s\n", "ę"); 
} 

輸出:

~$ gcc wcharexample.c -o wcharexample && ./wcharexample 
漢語 
ę 
+0

看起來這是我需要的,但XC8 SDK中沒有這樣的頭文件:( – Kamil

+0

這是依賴於實現的,無論您的源文件中是否有寬字符,都可能需要使用unicode字符串來表示他們,即使運行時支持在那裏。標準C中的 –

+0

使用'wprintf'和寬文字,他們在stdio.h –

相關問題