2014-06-08 53 views
4

我可以直接在Swift Character和它的Unicode數值之間轉換嗎?那就是:在Swift中轉換字符和CodePoint

var i:Int = ... // A plain integer index. 
var myCodeUnit:UInt16 = myString.utf16[i] 
// Would like to say myChar = myCodeUnit as Character, or equivalent. 

或...

var j:String.Index = ... // NOT an integer! 
var myChar:Character = myString[j] 
// Would like to say myCodeUnit = myChar as UInt16 

可以說:

myCodeUnit = String(myChar).utf16[0] 

,但是這意味着創建的每個字符的新字符串。而且我正在做這個數千次(解析文本),所以這是一個新的字符串的lot立即被丟棄。

+2

請注意,unicode不是16位字符集,而是21位字符集。 – Deduplicator

+1

你可以批量做這個操作嗎?說讀一個1024個字符的「字符串」,然後在每個字符的循環中,而不是爲每個字符分配一個字符串? – Erik

+0

是的,我知道21位問題。它比這更復雜,唉。謝謝SiLo,那正是我正在做的。實際上,我保持一個整數索引和一個String.Index並行。但它似乎有點迂迴。 –

回答

1

我跟一位正在研究Unicode的蘋果工程師講話,他說他們還沒有完成字符串中Unicode字符的實現。你在尋找一個代碼單元還是一個完整的角色?因爲獲得完整unicode字符的唯一正確方法是對字符串上的每個循環使用a。即

for c in "hello" { 
    // c is a unicode character of type Character 
} 

但是,這還沒有實施。

+0

謝謝凱爾,它看起來像是for-in迭代正在工作。我不能這樣使用它,因爲我需要跳出循環,然後返回,恢復我離開的地方數百次(標記)。但是..我看到有支持發電機!我還沒有弄清楚如何使用它們(可能沒有完全實現),但這將是我走的路。我確實想在Swift中完全做到這一點,只是爲了一致性。否則,我會得到一個NSData對象。 –

-1

我也有這個問題,我只是想出的方式轉換字符爲Unicode值:

var char:Character = "a" 
var unicodeValue = UnicodeScalar("a").value 

不知道又如何Unicode值轉換回字符。

+2

嘗試'var char = Character(UnicodeScalar(someUIntValue))' –

+0

我投這個答案,但後來發現它實際上是不好的。第二行不使用字符,而是Swift將其解釋爲UnicodeScalar的「a」。仍然如此:如何將字符強制爲UnicodeScalar? –

+0

錯誤:無法用'@lvalue Character'類型的參數調用'init' –

4

Character代表一個「Unicode字形羣集」,它可以是多個Unicode碼點。如果您需要一個Unicode碼點,則應該使用UnicodeScalar類型。

4

按照迅猛書:

字符串代碼單元

要獲得codeunit /爲字符串的每個字符序,你可以做到以下幾點:

var yourSwiftString = "甲乙丙丁" 
for scalar in yourSwiftString.unicodeScalars { 
    print("\(scalar.value) ") 
} 

Code Unit to String

因爲swift current不會有一種方法可以將序號/代碼單位轉換回UTF,我發現的最好方式仍然是NSString。也就是說,如果你有一個整型序數(32位,但代表21位碼點),您可以使用以下方法來轉換爲Unicode:

var i = 22247 
var unicode_str = NSString(bytes: &i, length: 4, encoding: NSUTF32LittleEndianStringEncoding) 

顯然,如果你要轉換的整數的數組,你需要將它們打包成首先是一個數組。