2014-07-09 23 views
1

我有一個很大的char數組,它包含用UTF-8編碼的捷克變音字符(例如「á」)。我需要將它們替換爲它們的ASCII等價物(例如「a」),因爲程序必須在Windows上工作(Linux控制檯完全接受這些字符)。 我正在通過char讀取數組char,並將內容寫入字符串。 這裏是我使用的代碼,這並不工作:如何在C++中比較/替換數組中的非ASCII字符?

int array_size = 50000; //size of file array 
char * array = new char[array_size]; //array to store file contents 
string ascicontent=""; 

if ('\u00E1'==array[zacatek]) { //check if char is "á" 
       ascicontent +='a'; //write ordinal "a" into string 
      } 

我甚至試圖與「A」代替「\ u00E1」,但它也不起作用。猜測有問題,這些字符比ascii長。

我該如何聲明非ASCII字符,因此可以進行比較?

+0

Windows控制檯和命令行參數確實支持Unicode。不幸的是,爲了利用這一點,你必須使用特定於Windows的功能而不是標準的C++功能。 – dan04

回答

1

每個char是單字節,但是UTF-8可以使用多字節編碼單個字符。尤其是U + 00E1被編碼爲兩個字節:0xC3 0xA1。所以你只能比較一個char就無法做到你想要的。

有多種方式,你可能能夠解決你的問題:一是

A),試着google搜索「Windows控制檯UTF-8」,看看是否能給出任何可能使事情就不必工作根本改變人物。 (我不知道如果有什麼可以爲你工作,我從來沒有嘗試過這一點。)

B)將數據轉換爲使用MultiByteToWideCharmbstowcs寬字符(wchar_t),然後谷歌如何使用wcout或對等輸出UTF-16到控制檯。

C)使用MultiByteToWideChar將數據從UTF-8轉換爲UTF-16。然後使用WideCharToMultiByte將UTF-16轉換爲控制檯的代碼頁,這取決於它能自動「最適合」常用字符(如「á」到「a」)。 D)如果你真的只關心一組有限的字符(比如只有捷克代碼頁中的重音字符),那麼你可能會編寫自己的UTF-8字節序列查找表和你想要的替換字符。您只需要通過多個字節而不是單個字符對UTF-8進行比較。在那裏的各種工具中,我發現this page有助於瞭解如何以各種方式編碼字符。

其中哪些對您的程序最有意義取決於各種因素,例如保持特定於Windows的作品與Linux特定或跨平臺部分發生衝突的難易程度。

+0

謝謝你指點我如何使用UTF-8字符在C++中工作,我從來沒有想過這可能是更大的問題。 更大的研究後,我指出,不存在UTF-8直接兼容命令行,所以A)是可惜不是appliable。發現可能D)是唯一能夠保持我的代碼清潔和多平臺的解決方案。用編碼提到的頁面是非常棒的幫助!我目前使用sstream來加載字符的十六進制值,然後進行比較。我將不得不爲每個角色添加約22個if語句,但只有少數測試字符已經可以工作:) – HeliTux

0

char在C中不是unicode,它確實是一個字節;它只會被恰好使用的終端控制檯轉換爲字形。在一些Linux實現中(比如Debian),它默認爲UTF-8,所以如果你的程序輸出一個以UTF-8編碼的字節序列,你的終端將顯示正確的字形。如果你知道array是UTF-8編碼的,你必須檢查正確的字節順序。

編輯:看看The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

+1

而對於例如字節按照正確的順序'\ u00E1'是['\ XC3 \ xa1'](http://www.fileformat.info/info/unicode/char/e1/index.htm)。 –

-2

請看看這個鏈接http://en.wikipedia.org/wiki/Wide_character。 我相信這個代碼可以幫助你:

std::wstring str(L"cccccááddddddd"); 
std::replace(str.begin(), str.end(), L'á', L'a'); 
+0

嗨,歡迎來到Stack Overflow。如果你能解釋爲什麼這個解決方案有助於解決這個問題,那將會很棒。 Stack Overflow上有很多新手,他們可以從你那裏學到一些東西......而對你來說真正顯而易見的東西不會對新來的人有所幫助:) –