第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Swift中使用Unicode代碼點

在Swift中使用Unicode代碼點

慕斯709654 2019-11-30 15:14:02
如果您對蒙古語的細節(jié)不感興趣,而只是想快速了解在Swift中使用和轉換Unicode值,那么請?zhí)烈呀邮艽鸢傅牡谝徊糠帧1尘拔乙獮閕OS應用程序中使用的傳統(tǒng)蒙古語呈現(xiàn)Unicode文本。更好的長期解決方案是使用AAT智能字體來呈現(xiàn)此復雜腳本。(確實存在這樣的字體,但是它們的許可證不允許修改和非個人使用。)但是,由于我從未制作過字體,更不用說AAT字體的所有渲染邏輯了,我只打算自己進行渲染。斯威夫特暫時。也許以后我可以學習制作智能字體。在外部,我將使用Unicode文本,但在內(nèi)部(以顯示為UITextView),我將Unicode轉換為以啞字體(用Unicode PUA值編碼)存儲的單個字形。因此,我的渲染引擎需要將蒙古Unicode值(范圍:U + 1820到U + 1842)轉換為存儲在PUA中的字形值(范圍:U + E360到U + E5CF)。無論如何,這是我的計劃,因為這是我過去在Java中所做的,但是也許我需要改變整體思維方式。例下圖顯示了使用兩種不同形式的字母u(用紅色)在蒙古語中寫過su兩次。(蒙古語是垂直書寫的,字母像草書字母一樣用英語連接。)在此處輸入圖片說明在Unicode中,這兩個字符串將表示為var suForm1: String = "\u{1830}\u{1826}"var suForm2: String = "\u{1830}\u{1826}\u{180B}"suForm2Swift 將自由變體選擇器(U + 180B)識別(正確)為在其前面String帶有u(U + 1826)的單元。Swift將其視為單個字符,擴展的字素簇。但是,出于自己進行渲染的目的,我需要將u(U + 1826)和FVS1(U + 180B)區(qū)分為兩個不同的UTF-16代碼點。為了內(nèi)部顯示,我將上述Unicode字符串轉換為以下呈現(xiàn)的字形字符串:suForm1 = "\u{E46F}\u{E3BA}" suForm2 = "\u{E46F}\u{E3BB}"題我一直在和Swift String和Character。關于它們有很多方便的事情,但是由于在我的特殊情況下,我只處理UTF-16代碼單元,所以我想知道是否應該使用舊的NSString而不是Swift的代碼String。我意識到我可以String.utf16用來獲取UTF-16代碼點,但是轉換回String并不是很好。堅持使用String和Character還是應該使用NSString和更好unichar?
查看完整描述

2 回答

?
素胚勾勒不出你

TA貢獻1827條經(jīng)驗 獲得超9個贊

為Swift 3更新


字符串和字符

對于幾乎每個人都在誰訪問了這個問題,未來String,并Character會為你的答案。


直接在代碼中設置Unicode值:


var str: String = "I want to visit 北京, Москва, ?????, ???????, and ???. ?"

var character: Character = "?"

使用十六進制設置值


var str: String = "\u{61}\u{5927}\u{1F34E}\u{3C0}" // a大?π

var character: Character = "\u{65}\u{301}" // é = "e" + accent mark

請注意,Swift字符可以由多個Unicode代碼點組成,但看起來像是一個字符。這稱為擴展字素簇。


另請參閱此問題。


轉換為Unicode值:


str.utf8

str.utf16

str.unicodeScalars // UTF-32


String(character).utf8

String(character).utf16

String(character).unicodeScalars

從Unicode十六進制值轉換:


let hexValue: UInt32 = 0x1F34E


// convert hex value to UnicodeScalar

guard let scalarValue = UnicodeScalar(hexValue) else {

    // early exit if hex does not form a valid unicode value

    return

}


// convert UnicodeScalar to String

let myString = String(scalarValue) // ?

或者:


let hexValue: UInt32 = 0x1F34E

if let scalarValue = UnicodeScalar(hexValue) {

    let myString = String(scalarValue)

}

其他一些例子


let value0: UInt8 = 0x61

let value1: UInt16 = 0x5927

let value2: UInt32 = 0x1F34E


let string0 = String(UnicodeScalar(value0)) // a

let string1 = String(UnicodeScalar(value1)) // 大

let string2 = String(UnicodeScalar(value2)) // ?


// convert hex array to String

let myHexArray = [0x43, 0x61, 0x74, 0x203C, 0x1F431] // an Int array

var myString = ""

for hexValue in myHexArray {

    myString.append(UnicodeScalar(hexValue))

}

print(myString) // Cat??

請注意,對于UTF-8和UTF-16,轉換并不總是那么容易。(請參閱UTF-8,UTF-16和UTF-32問題。)


NSString和unichar

也可能與工作NSString和unichar斯威夫特,但你應該明白,除非你是熟悉的語法轉換為斯威夫特目標C和好,這將是很難找到良好的文檔。


同樣,unichar是一個UInt16數(shù)組,如上所述,從UInt16Unicode標量值的轉換并不總是那么容易(即,將諸如emoji表情和其他字符的對象的替代對在上層代碼平面中轉換)。


自定義字符串結構

由于問題中提到的原因,我最終沒有使用任何上述方法。相反,我編寫了自己的字符串結構,該結構基本上是一個數(shù)組,UInt32用于保存Unicode標量值。


同樣,這不是大多數(shù)人的解決方案。如果只需要擴展或擴展一點功能,請首先考慮使用擴展。StringCharacter


但是,如果確實需要專門處理Unicode標量值,則可以編寫自定義結構。


優(yōu)點是:


不需要類型(間不斷切換String,Character,UnicodeScalar,UInt32做字符串操作時,等)。

完成Unicode操作后,最終的轉換String很容易。

易于在需要時添加更多方法

簡化了從Java或其他語言的代碼轉換

缺點是:


使代碼的可移植性和其他Swift開發(fā)人員的可讀性降低

沒有像本機Swift類型那樣經(jīng)過充分測試和優(yōu)化

它是您每次需要時都必須包含在項目中的另一個文件

您可以自己制作,但這是我的參考。最難的部分是使其變得可哈?;?/p>


// This struct is an array of UInt32 to hold Unicode scalar values

// Version 3.4.0 (Swift 3 update)



struct ScalarString: Sequence, Hashable, CustomStringConvertible {


    fileprivate var scalarArray: [UInt32] = []



    init() {

        // does anything need to go here?

    }


    init(_ character: UInt32) {

        self.scalarArray.append(character)

    }


    init(_ charArray: [UInt32]) {

        for c in charArray {

            self.scalarArray.append(c)

        }

    }


    init(_ string: String) {


        for s in string.unicodeScalars {

            self.scalarArray.append(s.value)

        }

    }


    // Generator in order to conform to SequenceType protocol

    // (to allow users to iterate as in `for myScalarValue in myScalarString` { ... })

    func makeIterator() -> AnyIterator<UInt32> {

        return AnyIterator(scalarArray.makeIterator())

    }


    // append

    mutating func append(_ scalar: UInt32) {

        self.scalarArray.append(scalar)

    }


    mutating func append(_ scalarString: ScalarString) {

        for scalar in scalarString {

            self.scalarArray.append(scalar)

        }

    }


    mutating func append(_ string: String) {

        for s in string.unicodeScalars {

            self.scalarArray.append(s.value)

        }

    }


    // charAt

    func charAt(_ index: Int) -> UInt32 {

        return self.scalarArray[index]

    }


    // clear

    mutating func clear() {

        self.scalarArray.removeAll(keepingCapacity: true)

    }


    // contains

    func contains(_ character: UInt32) -> Bool {

        for scalar in self.scalarArray {

            if scalar == character {

                return true

            }

        }

        return false

    }


    // description (to implement Printable protocol)

    var description: String {

        return self.toString()

    }


    // endsWith

    func endsWith() -> UInt32? {

        return self.scalarArray.last

    }


    // indexOf

    // returns first index of scalar string match

    func indexOf(_ string: ScalarString) -> Int? {


        if scalarArray.count < string.length {

            return nil

        }


        for i in 0...(scalarArray.count - string.length) {


            for j in 0..<string.length {


                if string.charAt(j) != scalarArray[i + j] {

                    break // substring mismatch

                }

                if j == string.length - 1 {

                    return i

                }

            }

        }


        return nil

    }


    // insert

    mutating func insert(_ scalar: UInt32, atIndex index: Int) {

        self.scalarArray.insert(scalar, at: index)

    }

    mutating func insert(_ string: ScalarString, atIndex index: Int) {

        var newIndex = index

        for scalar in string {

            self.scalarArray.insert(scalar, at: newIndex)

            newIndex += 1

        }

    }

    mutating func insert(_ string: String, atIndex index: Int) {

        var newIndex = index

        for scalar in string.unicodeScalars {

            self.scalarArray.insert(scalar.value, at: newIndex)

            newIndex += 1

        }

    }


    // isEmpty

    var isEmpty: Bool {

        return self.scalarArray.count == 0

    }


    // hashValue (to implement Hashable protocol)

    var hashValue: Int {


        // DJB Hash Function

        return self.scalarArray.reduce(5381) {

            ($0 << 5) &+ $0 &+ Int($1)

        }

    }


    // length

    var length: Int {

        return self.scalarArray.count

    }


    // remove character

    mutating func removeCharAt(_ index: Int) {

        self.scalarArray.remove(at: index)

    }

    func removingAllInstancesOfChar(_ character: UInt32) -> ScalarString {


        var returnString = ScalarString()


        for scalar in self.scalarArray {

            if scalar != character {

                returnString.append(scalar)

            }

        }


        return returnString

    }

    func removeRange(_ range: CountableRange<Int>) -> ScalarString? {


        if range.lowerBound < 0 || range.upperBound > scalarArray.count {

            return nil

        }


        var returnString = ScalarString()


        for i in 0..<scalarArray.count {

            if i < range.lowerBound || i >= range.upperBound {

                returnString.append(scalarArray[i])

            }

        }


        return returnString

    }



    // replace

    func replace(_ character: UInt32, withChar replacementChar: UInt32) -> ScalarString {


        var returnString = ScalarString()


        for scalar in self.scalarArray {

            if scalar == character {

                returnString.append(replacementChar)

            } else {

                returnString.append(scalar)

            }

        }

        return returnString

    }

    func replace(_ character: UInt32, withString replacementString: String) -> ScalarString {


        var returnString = ScalarString()


        for scalar in self.scalarArray {

            if scalar == character {

                returnString.append(replacementString)

            } else {

                returnString.append(scalar)

            }

        }

        return returnString

    }

    func replaceRange(_ range: CountableRange<Int>, withString replacementString: ScalarString) -> ScalarString {


        var returnString = ScalarString()


        for i in 0..<scalarArray.count {

            if i < range.lowerBound || i >= range.upperBound {

                returnString.append(scalarArray[i])

            } else if i == range.lowerBound {

                returnString.append(replacementString)

            }

        }

        return returnString

    }


    // set (an alternative to myScalarString = "some string")

    mutating func set(_ string: String) {

        self.scalarArray.removeAll(keepingCapacity: false)

        for s in string.unicodeScalars {

            self.scalarArray.append(s.value)

        }

    }


    // split

    func split(atChar splitChar: UInt32) -> [ScalarString] {

        var partsArray: [ScalarString] = []

        if self.scalarArray.count == 0 {

            return partsArray

        }

        var part: ScalarString = ScalarString()

        for scalar in self.scalarArray {

            if scalar == splitChar {

                partsArray.append(part)

                part = ScalarString()

            } else {

                part.append(scalar)

            }

        }

        partsArray.append(part)

        return partsArray

    }


    // startsWith

    func startsWith() -> UInt32? {

        return self.scalarArray.first

    }


    // substring

    func substring(_ startIndex: Int) -> ScalarString {

        // from startIndex to end of string

        var subArray: ScalarString = ScalarString()

        for i in startIndex..<self.length {

            subArray.append(self.scalarArray[i])

        }

        return subArray

    }

    func substring(_ startIndex: Int, _ endIndex: Int) -> ScalarString {

        // (startIndex is inclusive, endIndex is exclusive)

        var subArray: ScalarString = ScalarString()

        for i in startIndex..<endIndex {

            subArray.append(self.scalarArray[i])

        }

        return subArray

    }


    // toString

    func toString() -> String {

        var string: String = ""


        for scalar in self.scalarArray {

            if let validScalor = UnicodeScalar(scalar) {

                string.append(Character(validScalor))

            }

        }

        return string

    }


    // trim

    // removes leading and trailing whitespace (space, tab, newline)

    func trim() -> ScalarString {


        //var returnString = ScalarString()

        let space: UInt32 = 0x00000020

        let tab: UInt32 = 0x00000009

        let newline: UInt32 = 0x0000000A


        var startIndex = self.scalarArray.count

        var endIndex = 0


        // leading whitespace

        for i in 0..<self.scalarArray.count {

            if self.scalarArray[i] != space &&

                self.scalarArray[i] != tab &&

                self.scalarArray[i] != newline {


                startIndex = i

                break

            }

        }


        // trailing whitespace

        for i in stride(from: (self.scalarArray.count - 1), through: 0, by: -1) {

            if self.scalarArray[i] != space &&

                self.scalarArray[i] != tab &&

                self.scalarArray[i] != newline {


                endIndex = i + 1

                break

            }

        }


        if endIndex <= startIndex {

            return ScalarString()

        }


        return self.substring(startIndex, endIndex)

    }


    // values

    func values() -> [UInt32] {

        return self.scalarArray

    }


}


func ==(left: ScalarString, right: ScalarString) -> Bool {

    return left.scalarArray == right.scalarArray

}


func +(left: ScalarString, right: ScalarString) -> ScalarString {

    var returnString = ScalarString()

    for scalar in left.values() {

        returnString.append(scalar)

    }

    for scalar in right.values() {

        returnString.append(scalar)

    }

    return returnString

}


查看完整回答
反對 回復 2019-11-30
?
HUWWW

TA貢獻1874條經(jīng)驗 獲得超12個贊

//Swift 3.0  

// This struct is an array of UInt32 to hold Unicode scalar values

struct ScalarString: Sequence, Hashable, CustomStringConvertible {


    private var scalarArray: [UInt32] = []


    init() {

        // does anything need to go here?

    }


    init(_ character: UInt32) {

        self.scalarArray.append(character)

    }


    init(_ charArray: [UInt32]) {

        for c in charArray {

            self.scalarArray.append(c)

        }

    }


    init(_ string: String) {


        for s in string.unicodeScalars {

            self.scalarArray.append(s.value)

        }

    }


    // Generator in order to conform to SequenceType protocol

    // (to allow users to iterate as in `for myScalarValue in myScalarString` { ... })


    //func generate() -> AnyIterator<UInt32> {

    func makeIterator() -> AnyIterator<UInt32> {


        let nextIndex = 0


        return AnyIterator {

            if (nextIndex > self.scalarArray.count-1) {

                return nil

            }

            return self.scalarArray[nextIndex + 1]

        }

    }


    // append

    mutating func append(scalar: UInt32) {

        self.scalarArray.append(scalar)

    }


    mutating func append(scalarString: ScalarString) {

        for scalar in scalarString {

            self.scalarArray.append(scalar)

        }

    }


    mutating func append(string: String) {

        for s in string.unicodeScalars {

            self.scalarArray.append(s.value)

        }

    }


    // charAt

    func charAt(index: Int) -> UInt32 {

        return self.scalarArray[index]

    }


    // clear

    mutating func clear() {

        self.scalarArray.removeAll(keepingCapacity: true)

    }


    // contains

    func contains(character: UInt32) -> Bool {

        for scalar in self.scalarArray {

            if scalar == character {

                return true

            }

        }

        return false

    }


    // description (to implement Printable protocol)

    var description: String {


        var string: String = ""


        for scalar in scalarArray {

            string.append(String(describing: UnicodeScalar(scalar))) //.append(UnicodeScalar(scalar)!)

        }

        return string

    }


    // endsWith

    func endsWith() -> UInt32? {

        return self.scalarArray.last

    }


    // insert

    mutating func insert(scalar: UInt32, atIndex index: Int) {

        self.scalarArray.insert(scalar, at: index)

    }


    // isEmpty

    var isEmpty: Bool {

        get {

            return self.scalarArray.count == 0

        }

    }


    // hashValue (to implement Hashable protocol)

    var hashValue: Int {

        get {


            // DJB Hash Function

            var hash = 5381


            for i in 0 ..< scalarArray.count {

                hash = ((hash << 5) &+ hash) &+ Int(self.scalarArray[i])

            }

            /*

             for i in 0..< self.scalarArray.count {

             hash = ((hash << 5) &+ hash) &+ Int(self.scalarArray[i])

             }

             */

            return hash

        }

    }


    // length

    var length: Int {

        get {

            return self.scalarArray.count

        }

    }


    // remove character

    mutating func removeCharAt(index: Int) {

        self.scalarArray.remove(at: index)

    }

    func removingAllInstancesOfChar(character: UInt32) -> ScalarString {


        var returnString = ScalarString()


        for scalar in self.scalarArray {

            if scalar != character {

                returnString.append(scalar: scalar) //.append(scalar)

            }

        }


        return returnString

    }


    // replace

    func replace(character: UInt32, withChar replacementChar: UInt32) -> ScalarString {


        var returnString = ScalarString()


        for scalar in self.scalarArray {

            if scalar == character {

                returnString.append(scalar: replacementChar) //.append(replacementChar)

            } else {

                returnString.append(scalar: scalar) //.append(scalar)

            }

        }

        return returnString

    }


    // func replace(character: UInt32, withString replacementString: String) -> ScalarString {

    func replace(character: UInt32, withString replacementString: ScalarString) -> ScalarString {


        var returnString = ScalarString()


        for scalar in self.scalarArray {

            if scalar == character {

                returnString.append(scalarString: replacementString) //.append(replacementString)

            } else {

                returnString.append(scalar: scalar) //.append(scalar)

            }

        }

        return returnString

    }


    // set (an alternative to myScalarString = "some string")

    mutating func set(string: String) {

        self.scalarArray.removeAll(keepingCapacity: false)

        for s in string.unicodeScalars {

            self.scalarArray.append(s.value)

        }

    }


    // split

    func split(atChar splitChar: UInt32) -> [ScalarString] {

        var partsArray: [ScalarString] = []

        var part: ScalarString = ScalarString()

        for scalar in self.scalarArray {

            if scalar == splitChar {

                partsArray.append(part)

                part = ScalarString()

            } else {

                part.append(scalar: scalar) //.append(scalar)

            }

        }

        partsArray.append(part)

        return partsArray

    }


    // startsWith

    func startsWith() -> UInt32? {

        return self.scalarArray.first

    }


    // substring

    func substring(startIndex: Int) -> ScalarString {

        // from startIndex to end of string

        var subArray: ScalarString = ScalarString()

        for i in startIndex ..< self.length {

            subArray.append(scalar: self.scalarArray[i]) //.append(self.scalarArray[i])

        }

        return subArray

    }

    func substring(startIndex: Int, _ endIndex: Int) -> ScalarString {

        // (startIndex is inclusive, endIndex is exclusive)

        var subArray: ScalarString = ScalarString()

        for i in startIndex ..< endIndex {

            subArray.append(scalar: self.scalarArray[i]) //.append(self.scalarArray[i])

        }

        return subArray

    }


    // toString

    func toString() -> String {

        let string: String = ""


        for scalar in self.scalarArray {

            string.appending(String(describing:UnicodeScalar(scalar))) //.append(UnicodeScalar(scalar)!)

        }

        return string

    }


    // values

    func values() -> [UInt32] {

        return self.scalarArray

    }


}


func ==(left: ScalarString, right: ScalarString) -> Bool {


    if left.length != right.length {

        return false

    }


    for i in 0 ..< left.length {

        if left.charAt(index: i) != right.charAt(index: i) {

            return false

        }

    }


    return true

}


func +(left: ScalarString, right: ScalarString) -> ScalarString {

    var returnString = ScalarString()

    for scalar in left.values() {

        returnString.append(scalar: scalar) //.append(scalar)

    }

    for scalar in right.values() {

        returnString.append(scalar: scalar) //.append(scalar)

    }

    return returnString

}


查看完整回答
反對 回復 2019-11-30
  • 2 回答
  • 0 關注
  • 781 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號