EastAsianWidth
解析unicode.org 中的 UnicodeEastAsianWidth 并生成相关的 Swift 文件
Unicode 版本: 14.0
- https://www.unicode.org/versions/Unicode14.0.0/
- https://www.unicode.org/reports/tr11/tr11-39.html
- https://www.unicode.org/Public/14.0.0/ucd/EastAsianWidth.txt
- http://unicode.org/reports/tr11/
定义
East_Asian_Width:在与东亚传统字符编码互操作时,以及在实现东亚排版时,East_Asian_Width 是对字符的一种分类。它可以采取两种抽象值,窄和宽。
在传统的实现中,通常会有一个相应的编码长度差异(一个或两个字节)以及显示宽度的差异。然而,位图的实际显示宽度由字体决定,并且可能会进一步由布局调整。固定宽度的传统字体的一个重要类别包含仅两种宽度的符号,较宽的符号的宽度是较窄符号的两倍。
注意:为了方便,进一步的分类区分了显式和隐式宽和窄字符。
根据 Unicode 指南,East Asian Width 包含 6 种类型
- East Asian Fullwidth (F):所有在 Unicode 标准中定义为 Fullwidth 的字符,在其他地方的 Unicode 标准中有一个兼容性分解为隐式窄但未标记的字符。
- East Asian Halfwidth (H):所有在 Unicode 标准中明确定义为 Halfwidth 的字符,在其他地方的 Unicode 标准中有一个兼容性分解为隐式宽但未标记的字符,加上 U+20A9 ₩ won 表示符号。
- East Asian Wide (W):所有始终宽的字符。这些字符只出现在东亚排版中,它们是宽字符(如统一汉字或方片罗马字符号)。这个分类包括具有显式半宽度对应字符的字符,以及具有 [UTS51] 属性 Emoji_Presentation 的字符,但不包括具有 [UCD] 属性 Regional_Indicator 的字符。
- 东亚窄字符(Na):所有始终为窄字符且具有显式全角或宽字符对应的字符。这些字符在东亚字体排印和传统字符集中暗示为窄字符,因为它们有显式的全角或宽字符对应。所有ASCII字符都是东亚窄字符的例子。
- 东亚模糊字符(A):所有可能有时宽有时窄的字符。模糊字符需要字符代码中不含的额外信息来进一步确定它们的宽度。
- 中性(非东亚):所有其他字符。中性字符不出现在传统东亚字符集中。广义上,它们也不出现在东亚字体排印中。例如,没有传统的日本排版Devanagari的方式。窄字符和中性字符的规范等效物本身可能不是窄或中性。例如,U+00C5 Å LATIN CAPITAL LETTER A WITH RING ABOVE 是中性的,但其分解以窄字符开始。
在此处我们想要处理的是 全角
& 半角
,其定义如下(在将Unicode映射到东亚传统字符时)
- 宽Unicode字符
始终
映射到全角
字符。- 窄(和中性)Unicode字符
始终
映射到半角
字符。- 半角Unicode字符
始终
映射到半角
字符。- 模糊Unicode字符
始终
映射到全角
字符。
如何使用
// MARK: String - contains F,H,W,Na,A,N characters checking
var str = "abc"
print(str.containsEastAsianAmbiguousCharacters)
// MARK: String.UnicodeScalarView - check fullwidth/halfwidth count
str.unicodeScalars.countByEastAsianWidth()
// MARK: UnicodeScalar - check which EastAsianWidth type of this character
str.unicodeScalars.forEach { scalar in
if scalar.isEastAsianHalfWidth {
print("\(scalar) is half width character.")
}
}
您可以在 Sources/EastAsianWidth
文件夹中查看更多功能详情。
示例
要运行示例项目,先克隆仓库,然后从示例目录运行 pod install
。
安装
UnicodeEastAsianWidth 通过 CocoaPods 提供。要安装,只需将以下行添加到您的 Podfile 中
pod 'UnicodeEastAsianWidth'
代码结构
--- Sources/EastAsianWidth
| |
| -- String+Extension.swift
| -- UnicodeScarlar+Generated.swift
| -- UnicodeScarlar+Recommendations.swift
| -- UnicodeScarlarView+Extension.swift
|
|- Tests/EastAsianWidthTests
| |
| -- CountByEastAsianWidthTests.swift
| -- EastAsianAmbiguousTests.swift
| -- EastAsianFullwidthTests.swift
| -- EastAsianHalfwidthTests.swift
| -- EastAsianNarrowTests.swift
| -- EastAsianNeutralTests.swift
| -- EastAsianWideTests.swift
| -- EdgeCharacters+Generated.swift
| -- FullwidthTests.swift
| -- HalfwidthTests.swift
| -- TestUtils.swift
| -- XCTestManifests.swift
|
- Scripts
| |
| -- EastAsianWidth.txt
| -- FileReader.py
| -- CodePrinter.py
| -- SwiftGenerator.py
| -- generate.py
| -- run.sh
什么是脚本
我们可以直接运行 ./Scripts/run.sh
,这将自动生成 UnicodeScarlar+Generated.swift
到 Swift 包。
作者
何武(HevaWu) [email protected]
许可
UnicodeEastAsianWidth 根据 MIT 许可证提供。有关更多信息,请参阅 LICENSE 文件。