2018-05-31 17:41:55 asuno_1 阅读数 477

 swift 采用Unicode编码,几乎涵盖了所有我们知道的字符。

let  andSign:Charaterar = ""

let andSign:Charater = "\u{26}"

\t         \u{0009}     水平制表符tab

\n        \u{000a}   换行

\r        \u{000d}     回车

\"        \u{0022}    双引号

\'         \u{0027}  单引号

\\         \u{005c}   反斜线

如果不指定类型那么系统默认为字符串

 完整的Unicode地址

2016-11-02 00:39:54 tanghw 阅读数 3123

Swift中的String完全支持Unicode,它可以使用一个Unicode scalar来构造一个字符串。

var 坤卦 = "\u{2637}"
print(坤卦)

在Xcode的Playground项目中运行,则会看到一个代表坤卦

的符号。

上面的例子说明,坤卦的符号的Unicode scalar为十六进制2637,也即 U+2637 .

这个特性很令人激动,因为我们在构造字符串的时候,完全摆脱了仅用文本字符的限制。但问题是,我如何知道特定字符的Unicode编码呢?

Unicode编码表很大,查询时有一定的困难。一种便捷的方法是,在指定的Unicode scalar的范围内,打印出其相应的字符。

Swift有一个对应的数据类型,UnicodeScalar, 可以直接打印其字符。

下面是实现这个功能的代码。

var start:Int = 0x1F493
let counts:Int = 10

for _ in 1...counts {
    let hex = String(start, radix: 16, uppercase: true)
    
    print("\\u{\(hex)}: \(UnicodeScalar(start)!)")
    
    start += 1
}
变量start指定了Unicode scalar的起始范围,counts指定要打印10个。hex存有转换为大写十六进制的Unicode scalar的值。在print函数中,先将0x1F493传入UnicodeScalar类,以构造一个UnicodeScalar实例,然后将其按指定的格式打印出来。之后,start加1, 以打印紧跟其后的字符。

运行这个例子,将看到:



试着改变start及counts的值,就可以方便地查看特定范围的Unicode编码了。

2017-05-12 18:22:56 mardax 阅读数 575

Unicode

swift中字符类型为Character,使用Unicode编码,String由一系列Character组成,自然也使用Unicode编码

Unicode scalar

Unicode scalar是合法Unicode字符码(code point),唯一的21-bit数字(内存中占据32-bit,实际只使用21-bit),Unicode scalar包括:
  • [U+0000, U+D7FF]
  • [U+E000, U+10FFFF]
注:Unicode scalar不包括[U+D800, U+DFFF],[U+D800, U+DFFF]是保留Unicode字符码,未来备用

special character

  • 转义字符:\\,\n,\r,\"等
  • Unicode scalar:\u{n}(n为1-8位十六进制数字,n值等于合法Unicode字符码,即Unicode scalar)
func special_char()
{
    let c1: Character = "\""
    let c2: Character = "\\"
    print("c1 = \(c1), c2 = \(c2)")
        
    let c3: Character = "\u{24}"
    let c4: Character = "\u{2665}"
    print("c3 = \(c3), c4 = \(c4)")
}
output:
c1 = ", c2 = \
c3 = $, c4 = ♥

extended grapheme cluster

extended grapheme cluster,扩展字符簇,由一个或多个Unicode scalar组成,但本质还是单一字符
func extended_grapheme_cluster()
{
    let eAcute: Character = "\u{E9}"                         // é
    let combinedEAcute: Character = "\u{65}\u{301}"          // e followed by ́
    print("eAcute = \(eAcute), combinedEAcute = \(combinedEAcute), \(eAcute == combinedEAcute)")
        
    let precomposed: Character = "\u{D55C}"                  // 한
    let decomposed: Character = "\u{1112}\u{1161}\u{11AB}"   // ᄒ, ᅡ, ᆫ
    print("precomposed = \(precomposed), decomposed = \(decomposed), \(precomposed == decomposed)")
        
    let enclosedEAcute: Character = "\u{E9}\u{20DD}" // enclosedEAcute is é⃝
    print("enclosedEAcute = \(enclosedEAcute)")
}
output:
eAcute = é, combinedEAcute = é, true
precomposed = 한, decomposed = 한, true
enclosedEAcute = é⃝

Unicode encode

当Unicode字符进行IO操作写入外存或进行网络传输,需对Unicode字符编码,Unicode定义了几种编码格式,每种编码格式定义了code unit(代码单元),每个Unicode字符编码成n个code unit(n >= 1):
  • UTF-8:code unit = 8-bit,用UInt8表示,Unicode字符编码为n个UInt8
  • UTF-16:code unit = 16-bit,用UInt16表示,Unicode字符编码为n个UInt16
  • UTF-32:code unit = 32-bit,用UInt32表示,Unicode字符编码为n个UInt32
注:Unicode scalar内存中占据32-bit,实际只使用21-bit
func unicode_encode()
{
    let str1: String = "\u{E9}"
    let str2: String = "\u{65}\u{301}"
    print("str1 len = \(str1.characters.count), str2 len = \(str2.characters.count), \(str1 == str2)")
        
    print("str1 encode")
    for codeUnit in str1.utf8
    {
        print("\(codeUnit)", terminator: "|")
    }
    print("")
        
    for codeUnit in str1.utf16
    {
        print("\(codeUnit)", terminator: "|")
    }
    print("")
        
    for scalar in str1.unicodeScalars
    {
        print("\(scalar.value)", terminator: "|")
    }
    print("")
        
    print("str2 encode")
    for codeUnit in str2.utf8
    {
        print("\(codeUnit)", terminator: "|")
    }
    print("")
        
    for codeUnit in str2.utf16
    {
        print("\(codeUnit)", terminator: "|")
    }
    print("")
        
    for scalar in str2.unicodeScalars
    {
        print("\(scalar.value)", terminator: "|")
    }
    print("")
}
output:
str1 len = 1, str2 len = 1, true
str1 encode
195|169|
233|
233|
str2 encode
101|204|129|
101|769|
101|769|
总结:
  • 同一字符在不同编码格式下编码为不同字节流
  • 由于extended grapheme cluster原因,同一字符在同一编码格式下也可能编码为不同字节流
  • ASCII字符编码为UTF-8,UTF-16,UTF-32后字符码不变,依旧跟ASCII字符码相同,但占据内存空间不同,分别占据UInt8,UInt16,UInt32
注:scalar.value获取Unicode scalar实际使用的21-bit

Character

Character是swift中字符类型,使用Unicode编码

字面值常量

Character支持以下几种格式:
  • 字符:"a"
  • 转义字符:"\"","\\","\n","\u{2665}"
  • extended grapheme cluster:"\u{65}\u{301}","\u{1112}\u{1161}\u{11AB}"
func char()
{
    let c1: Character = "a"
    
    let c2: Character = "\""
    let c3: Character = "\u{2665}"
    
    let c4: Character = "\u{65}\u{301}"
    let c5: Character = "\u{1112}\u{1161}\u{11AB}"
    //let c6: Character = "\u{1112}\u{1161}\u{11AB}\u{2665}" //not extended grapheme cluster
    
    print("c1 = \(c1)")
    print("c2 = \(c2)")
    print("c3 = \(c3)")
    print("c4 = \(c4)")
    print("c5 = \(c5)")
}
output:
c1 = a
c2 = "
c3 = ♥
c4 = é
c5 = 한
总结:
  • Character为单一字符,用双引号包围(非单引号,不同于c),只允许包围单一字符(不允许0个或多个字符),包括转义字符,extended grapheme cluster
  • 类型推断时,双引号包围的单一字符为String,非Character
  • 编译器会识别extended grapheme cluster是否合法,如果是非法extended grapheme cluster,编译器解释为String,非Character

不支持隐式类型转换

Character本质为struct类型,仅仅表示字符,使用Unicode编码,不支持与数值类型的隐式转换
func implicit_convert()
{
    var c: Character = "a"
    var i: Int = 5;
    
    //c = i
    //i = c
}
2018-07-12 16:09:17 weixin_40918107 阅读数 817

Swift Unicode的格式是 "\u{n}" n是16进制的数,比如"\u{f602}",这只占用一个字符,但是数据库里返回的是"f602"字符串,用的时候需要转成Unicode类型。这需要把"f602"转成16进制数,然后再转成Unicode。话不多说直接上代码:

let a = "f602"

let b =  Int(a,radix:16).map{String(UnicodeScalar($0)!)}

此时b就是Unicode类型的. b = "\u{f602}"



2016-01-27 19:05:22 xinqing007 阅读数 260

概述:
Unicode 是一个国际标准,用于文本的编码和表示。 它使您可以用标准格式表示来自任意语言几乎所有的字 符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。
Swift 的 String 和 Character 类型是完 全兼容 Unicode 标准的。

Unicode 标量(Unicode Scalars)(了解)


Unicode 标量(Unicode Scalars)
Swift 的 String 类型是基于 Unicode 标量 建立的。 Unicode 标量是对应字符或者修饰符的唯一的21位数 字,例如 U+0061 表示小写的拉丁字母( LATIN SMALL LETTER A )(" a "), U+1F425 表示小鸡表情(
ABY CHICK ) (" ? ")。
注意: Unicode 码位(code poing) 的范围是 U+0000 到 U+D7FF 或者 U+E000 到 U+10FFFF 。Unicode 标量不包 括 Unicode 代理项(surrogate pair) 码位,其码位范围是 U+D800 到 U+DFFF 。
注意不是所有的21Unicode 标量都代表一个字符,因为有一些标量是留作未来分配的。已经代表一个典型字符 的标量都有自己的名字,例如上面例子中的 LATIN SMALL LETTER A 和 FRONT-FACING BABY CHICK 。

字符串字面量的特殊字符 (Special Characters in String Literals)

字符串字面量可以包含以下特殊字符:
• 转义字符 \0 (空字符)、 \ (反斜线)、 \t (水平制表符)、 \n (换行符)、 \r (回车符)、 \” (双引 号)、 \’ (单引号)。
• Unicode 标量,写成 \u{n} (u为小写),其中 n 为任意一到��位十��进制数且可用的 Unicode 位码。

下面的代码为各种特殊字符的使用示例。 wiseWords 常量包含了两个双引号。 dollarSign 、 blackHeart 和 rklingHeart 常量演示了三种不同格式的 Unicode 标量:

let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"//wiseWords 常量包含了两个双引号
let dollarSign = "\u{24}"// $, Unicode 标量 U+0024
let blackHeart = "\u{2665}"//黑色心形, Unicode 标量 U+2665
let sparklingHeart = "\u{1F496}"//红色心形, Unicode 标量 U+1F496

可扩展的字形群集(Extended Grapheme Clusters)

let eAcute: Character = "\u{E9}" // é
let combinedEAcute: Character = "\u{65}\u{301}" // e 后面加上 ? 
//在这两种情况中,字母 é 代表了一个单一的 Swift 的 Character 值,同时代表了一个可扩展的字形群。 在第一 种情况,这个字形群包含一个单一标量;而在第二种情况,它是包含两个标量的字形群:

可拓展的字符群集可以使包围记号(例如 COMBINING ENCLOSING CIRCLE 或者 U+20DD )的标量包围其他 Unicode 标 量,作为一个单一的 Character 值:

let enclosedEAcute: Character = "\u{E9}\u{20DD}" // enclosedEAcute 是 é?

局部的指示符号的 Unicode 标量可以组合成一个单一的 Character 值,例如 REGIONAL INDICATOR SYMBOL LETTER U ( U+1F1FA )和 REGIONAL INDICATOR SYMBOL LETTER S ( U+1F1F8 ):

let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}" // regionalIndicatorForUS 是 ??

========有待扩展=======

Swift的Unicode使用以及标量

博文 来自: qq350116542
没有更多推荐了,返回首页