UnicodeEastAsianWidth 2.1.0

UnicodeEastAsianWidth 2.1.0

He Wu(Heva) 维护。



EastAsianWidth

解析unicode.org 中的 UnicodeEastAsianWidth 并生成相关的 Swift 文件

Unicode 版本: 14.0

CI Status Version License Platform

定义

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 文件。