2015-07-21 46 views
0

我有一個UTF-16文件(或UCS-2,因爲它是UTF-16 LE據我所知)編碼,我從這裏下載:http://www.humancomp.org如何讀取UTF-16文件並將其內容與使用十六進制值定義的wchar_t *字符串文字進行比較

我想讀取該文件的內容到std::wstring,這是我的第一個問題:我一直無法讀取文件正確的呢。讀取的數據似乎總是搞砸了。

其次,我想比較讀std::wstring字符串文字const wchar_t*。在這裏,我遇到了我的第二個問題:如何通過十六進制值指定wchar_t內容?

,我想變成一隻const wchar_t*字符串文字的文件具有以下字節(複製出一個十六進制編輯器的)

FE FF 05 31 05 65 05 81 05 65 05 70 05 6B 00 20 05 6B 05 74 00 20 05 6C 05 61 05 7E 00 20 00 3F 05 82 05 72 05 6B 05 65 00 20 05 6C 05 61 05 7E 05 61 05 80 05 61 05 80 00 2C 00 0D 00 0A 05 3F 05 75 05 61 05 65 05 62 05 7D 00 20 05 79 05 7F 05 61 05 75 05 6B 00 20 05 6F 05 61 05 7D 05 6F 05 61 05 6E 05 6B 00 20 05 74 05 70 05 63 05 6B 05 65 00 2E 00 2E 00 2E 00 0D 00 0A 05 31 05 75 05 65 05 7A 05 70 05 7D 00 20 05 6F 00 3F 05 82 05 66 05 70 05 6B 00 20 05 74 05 70 05 6F 05 65 00 20 05 6B 05 65 05 6E 00 20 00 3F 05 61 05 7E 05 61 05 7F 05 80 00 2C 00 0D 00 0A 05 31 05 75 05 65 05 7A 05 70 05 7D 00 20 05 6F 00 3F 05 82 05 66 05 70 05 6B 00 20 00 3F 05 61 05 7E 05 61 05 7F 05 61 05 6C 00 20 05 74 05 70 05 6F 05 6B 05 65 05 89

當然,我不能初始化字符串常量這一點。我試圖把它變成十六進制值,並應用reinterpret_cast獲得const wchar_t*

reinterpret_cast<const wchar_t*>("\xFE\xFF\x05\x31\x05\x65\x05\x81\x05\x65\x05\x70\x05\x6B\x00\x20\x05\x6B\x05\x74\x00\x20\x05\x6C\x05\x61\x05\x7E\x00\x20\x00\x3F\x05\x82\x05\x72\x05\x6B\x05\x65\x00\x20\x05\x6C\x05\x61\x05\x7E\x05\x61\x05\x80\x05\x61\x05\x80\x00\x2C\x00\x0D\x00\x0A\x05\x3F\x05\x75\x05\x61\x05\x65\x05\x62\x05\x7D\x00\x20\x05\x79\x05\x7F\x05\x61\x05\x75\x05\x6B\x00\x20\x05\x6F\x05\x61\x05\x7D\x05\x6F\x05\x61\x05\x6E\x05\x6B\x00\x20\x05\x74\x05\x70\x05\x63\x05\x6B\x05\x65\x00\x2E\x00\x2E\x00\x2E\x00\x0D\x00\x0A\x05\x31\x05\x75\x05\x65\x05\x7A\x05\x70\x05\x7D\x00\x20\x05\x6F\x00\x3F\x05\x82\x05\x66\x05\x70\x05\x6B\x00\x20\x05\x74\x05\x70\x05\x6F\x05\x65\x00\x20\x05\x6B\x05\x65\x05\x6E\x00\x20\x00\x3F\x05\x61\x05\x7E\x05\x61\x05\x7F\x05\x80\x00\x2C\x00\x0D\x00\x0A\x05\x31\x05\x75\x05\x65\x05\x7A\x05\x70\x05\x7D\x00\x20\x05\x6F\x00\x3F\x05\x82\x05\x66\x05\x70\x05\x6B\x00\x20\x00\x3F\x05\x61\x05\x7E\x05\x61\x05\x7F\x05\x61\x05\x6C\x00\x20\x05\x74\x05\x70\x05\x6F\x05\x6B\x05\x65\x05\x89");

但這不起作用。它給了我虛假的數據。

我還試圖建立一個wchar_t字符串字面直接:

L"\xFEFF\x0531\x0565\x0581\x0565\x0570\x056B\x0020\x056B\x0574\x0020\x056C\x0561\x057E\x0020\x003F\x0582\x0572\x056B\x0565\x0020\x056C\x0561\x057E\x0561\x0580\x0561\x0580\x002C\x000D\x000A\x053F\x0575\x0561\x0565\x0562\x057D\x0020\x0579\x057F\x0561\x0575\x056B\x0020\x056F\x0561\x057D\x056F\x0561\x056E\x056B\x0020\x0574\x0570\x0563\x056B\x0565\x002E\x002E\x002E\x000D\x000A\x0531\x0575\x0565\x057A\x0570\x057D\x0020\x056F\x003F\x0582\x0566\x0570\x056B\x0020\x0574\x0570\x056F\x0565\x0020\x056B\x0565\x056E\x0020\x003F\x0561\x057E\x0561\x057F\x0580\x002C\x000D\x000A\x0531\x0575\x0565\x057A\x0570\x057D\x0020\x056F\x003F\x0582\x0566\x0570\x056B\x0020\x003F\x0561\x057E\x0561\x057F\x0561\x056C\x0020\x0574\x0570\x056F\x056B\x0565\x0589"

這又在虛假的數據結束了。我甚至不確定這是否是指定wchar_t數據的正確方法 - 組合2個字節?

+2

您的文件的字節在** UTF-16BE **中(由於UTF-16BE BOM的存在而明顯)。如果您的字符串文字是以** UTF-16LE **替代,則您必須先進行轉換,然後才能進行比較。您的原始字面字節的'reinterpret_cast'沒問題,只是因爲您沒有在UTF-16中包含空終止符:'\ x00 \ x00',所以在最後得到垃圾。你的'L「...」'文字是正確的終止。 –

+0

要將UTF-16BE編碼文件讀入到std :: wstring中,可以使用一個'std :: wifstream',它已經用'std :: locale'對象編寫了'imbue()',代表UTF-16BE 。如果您使用的是C++ 11,則可以創建一個'std :: locale',它使用'std :: codecvt_utf16'類並啓用它的'std :: consume_header'標誌,這樣它就會考慮BOM。 –

回答

0

這是這是由雷米勒博註釋的幫助下實現的解決方案:

// BOM: \xFEFF 
auto utf16raw = L"\x0531\x0565\x0581\x0565\x0570\x056B\x0020\x056B\x0574\x0020\x056C\x0561\x057E\x0020\x003F\x0582\x0572\x056B"; 
std::wstring utf16str{utf16raw}; 

的BOM必須留出的字符串。 例如,可以使用UTF-8 CPP library available on Sourceforge將UTF-16字符串utf16str轉換爲UTF-8編碼的字符串(反之亦然)。

+1

如果允許使用C++ 11或更高版本,則只需標準庫即可在UTF-8和UTF-16之間進行轉換。請參閱http://stackoverflow.com/a/18597384/6345以供參考。 –

相關問題