2011-10-23 92 views
12

我在這裏和其他地方看過很多其他帖子(見下文),但我仍然沒有明確的答案:Windows wchar_t如何處理基本多語言平面之外的unicode字符?windows wchar_t如何處理基本多語言平面之外的unicode字符?

即:

那麼,當Windows想要在Windows上編碼(U + 2008A)Han字符時,Windows會做什麼?

+1

Windows使用UCS2作爲編碼。 –

+1

這就是我的想法。但是,我只是成功地在我的Windows計算機上編輯了一個文件名,以包含(U + 1D565)數學雙重打擊小T(請參閱http://programmers.stackexchange.com/questions/102205/should-utf-16-be -considered有害)。很顯然,即使Windows使用UCS-2,它也允許我將SMP字符放在文件名中。那麼它是如何做到的? – vy32

+1

根據[Wikipedia](http://en.wikipedia.org/wiki/NTFS#Internals),「NTFS允許任何16位值序列用於名稱編碼(文件名,流名稱,索引名稱等) 。這意味着支持UTF-16代碼點,但是文件系統不檢查序列是否是有效的UTF-16(它允許任何序列的短值,不限於Unicode標準中的那些)「。 –

回答

16

Windows stdlib下的wchar_t的實現是UTF-16無關緊要的:它只知道大約16位的代碼單元。

因此,您可以在字符串中放置一個UTF-16替代序列,並且您可以選擇使用更高級別的處理將其視爲單個字符。字符串實現不會做任何事情來幫助你,也不會阻礙你;它會讓你在你的字符串中包含任何代碼單元序列,甚至在解釋爲UTF-16時也是無效的。

許多Windows的高級功能都支持UTF-16代理製作的字符,這就是爲什麼你可以調用文件.txt,並且看到它正確渲染並正確編輯(只需一個按鍵,而不是兩個,移動過去的角色)像支持複雜文本佈局的資源管理器(通常使用Windows的Uniscribe庫)的程序。

但仍有地方,你可以看到UTF-16健忘照進來,比如你可以創建一個相同的文件夾名爲.txt.txt,在不區分大小寫否則將禁止其文件的事實,或您可以通過編程創建[U+DC01][U+D801].txt這一事實。

這就是學者們如何就Windows是否「支持」UTF-16字符串或者僅支持UCS-2的問題進行長時間的,毫無意義的爭論。

+2

+1爲「支持」。首先定義你的術語,然後爭論。 :) –

+0

這些'.txt'-s在Chrome中對我來說都是一樣的(一個「?」),這不是意圖,對嗎? ;) – mlvljr

7

Windows用於使用UCS-2,但在Windows 2000中採用了UTF-16。Windows wchar_t API現在生成並使用UTF-16。

並非所有的第三方程序都能正確處理這個問題,因此可能會在BMP以外的數據中出現問題。

另請注意,作爲可變長度編碼的UTF-16不符合與wchar_t一起使用的編碼的C或C++要求。這會導致一些問題,例如某些採用wchar_t的單個wchar_t的標準函數無法在Windows上處理BMP以外的字符,並且Windows定義了一些使用更寬類型的附加函數以便能夠處理單個字符在BMP之外。我忘記了它是什麼功能,但我碰到了一個返回int而不是wchar_t的Windows函數(並且它不是EOF可能的結果)。

相關問題