1# 字符处理 2 3<!--Kit: Localization Kit--> 4<!--Subsystem: Global--> 5<!--Owner: @yliupy--> 6<!--Designer: @sunyaozu--> 7<!--Tester: @lpw_work--> 8<!--Adviser: @Brilliantry_Rui--> 9 10## 使用场景 11 12不同语言中字符规则差异较大,通常很难从对应文本中提取需要的信息。通过字符处理,可以在不同语言规则下,以相似的逻辑处理文本。 13 14## 开发步骤 15 16 17### 字符属性 18 19字符属性用于判断字符类别,如判断字符是否为数字、字母、空格,是否为从右到左语言的字符,是否为表意文字(主要是中文日文韩文)等。 20 21使用Unicode类的[isDigit](../reference/apis-localization-kit/js-apis-i18n.md#isdigit9)等接口可以实现该功能,具体开发步骤如下: 22 231. 导入模块。 24 25 ```ts 26 import { i18n } from '@kit.LocalizationKit'; 27 ``` 28 292. 判断字符属性。 30 31 ```ts 32 let isDigit: boolean = i18n.Unicode.isDigit(ch: string); 33 ``` 34 353. 以一般类别值为例,获取字符类型。 36 37 ```ts 38 let unicodeType: string = i18n.Unicode.getType(ch: string); 39 ``` 40 41**开发实例** 42```ts 43// 导入模块 44import { i18n } from '@kit.LocalizationKit'; 45 46// 判断字符是否是数字 47let isDigit: boolean = i18n.Unicode.isDigit('1'); // isDigit = true 48 49// 判断字符是否是从右到左语言的字符 50let isRTL: boolean = i18n.Unicode.isRTL('a'); // isRTL = false 51 52// 判断字符是否是表意文字 53let isIdeograph: boolean = i18n.Unicode.isIdeograph('华'); // isIdeograph = true 54 55// 获取字符的一般类别值 56let unicodeType: string = i18n.Unicode.getType('a'); // unicodeType = 'U_LOWERCASE_LETTER' 57``` 58 59 60### 音译 61 62音译是指将采用某个文字系统或字母表表示的文本转换为发音相同的采用另一个文字系统或字母表表示的文本的过程,并不等同于翻译。使用Transliterator类的[transform](../reference/apis-localization-kit/js-apis-i18n.md#transform9)接口可以实现音译功能,具体开发步骤如下: 63 64> **说明:** 65> 本模块支持中文汉字转拼音,但当中文文本中包含多音字时,可能出现部分多音字无法按照正确的发音转换为拼音的问题。 66 671. 导入模块。 68 ```ts 69 import { i18n } from '@kit.LocalizationKit'; 70 ``` 71 722. 获取音译支持的转换ID列表并创建Transliterator对象。 73 ```ts 74 let ids: string[] = i18n.Transliterator.getAvailableIDs(); // 获取音译支持的转换ID列表 75 let transliterator: i18n.Transliterator = i18n.Transliterator.getInstance(id: string); // 传入音译支持的转换ID,创建Transliterator对象 76 ``` 77 783. 音译文本。 79 ```ts 80 let translatedText: string = transliterator.transform(text: string); // 对text内容进行音译 81 ``` 82 83 84**开发实例** 85```ts 86// 导入模块 87import { i18n } from '@kit.LocalizationKit'; 88 89// 音译成Latn格式 90let transliterator: i18n.Transliterator = i18n.Transliterator.getInstance('Any-Latn'); 91let text: string = '中国'; 92let translatedText: string = transliterator.transform(text); // translatedText = 'zhōng guó' 93 94// 汉语音译去声调 95let toneLessTransliterator: i18n.Transliterator = i18n.Transliterator.getInstance('Any-Latn;Latin-Ascii'); 96translatedText = toneLessTransliterator.transform('中国'); // translatedText = 'zhong guo' 97 98// 汉语姓氏读音 99let nameTransliterator: i18n.Transliterator = i18n.Transliterator.getInstance('Han-Latin/Names'); 100translatedText = nameTransliterator.transform('单老师'); // translatedText = 'shàn lǎo shī' 101translatedText = nameTransliterator.transform('长孙无忌'); // translatedText = 'zhǎng sūn wú jì' 102 103// 获取音译支持的转换ID列表 104let ids: string[] = i18n.Transliterator.getAvailableIDs(); // ids = ['ASCII-Latin', 'Accents-Any', ...] 105``` 106 107 108### 文本标准化 109 110文本标准化是指按指定的范式标准化文本。使用Normalizer类的[normalize](../reference/apis-localization-kit/js-apis-i18n.md#normalize10)接口可以实现文本标准化,具体开发步骤如下: 111 1121. 导入模块。 113 ```ts 114 import { i18n } from '@kit.LocalizationKit'; 115 ``` 116 1172. 使用文本标准化范式创建标准化对象。文本标准化的范式包括NFC、NFD、NFKC和NFKD,范式的详细介绍请参考[国际标准](https://www.unicode.org/reports/tr15/#Norm_Forms)。 118 ```ts 119 let normalizer: i18n.Normalizer = i18n.Normalizer.getInstance(mode: NormalizerMode); 120 ``` 121 1223. 文本标准化。 123 ```ts 124 let normalizedText: string = normalizer.normalize(text: string); // 对text文本进行标准化处理 125 ``` 126 127**开发实例** 128```ts 129// 导入模块 130import { i18n } from '@kit.LocalizationKit'; 131 132// 按照NFC范式对文本进行标准化处理 133let normalizer: i18n.Normalizer = i18n.Normalizer.getInstance(i18n.NormalizerMode.NFC); 134let normalizedText: string = normalizer.normalize('\u1E9B\u0323'); // normalizedText = 'ẛ̣' 135``` 136 137 138### 获取文本的可换行点 139 140使用[BreakIterator](../reference/apis-localization-kit/js-apis-i18n.md#breakiterator8)类的接口可以根据设定的区域获取文本的可换行点,具体开发步骤如下: 141 1421. 导入模块。 143 ```ts 144 import { i18n } from '@kit.LocalizationKit'; 145 ``` 146 1472. 创建获取文本可换行点的对象。传入合法的区域ID,创建BreakIterator类型的对象,该对象将按照指定区域的规则计算文本中的可换行点的位置。 148 149 ```ts 150 let iterator: i18n.BreakIterator = i18n.getLineInstance(locale: string); 151 ``` 152 1533. 设置要处理的文本。 154 ```ts 155 iterator.setLineBreakText(text: string); // 设置要处理的文本 156 let breakText: string = iterator.getLineBreakText(); // 查看iterator正在处理的文本 157 ``` 158 1594. 获取可换行点的位置。 160 ```ts 161 let currentPos: number = iterator.current(); // 获取换行迭代器在当前所处理文本中的位置 162 let firstPos: number = iterator.first(); // 设置为第一个可换行点,返回该可换行点的位置。第一个可换行点总是在文本的起始位置,firstPos = 0 163 let nextPos: number = iterator.next(index?: number); // 将换行迭代器移动index数量个可换行点,index为正数代表向后移动,index为负数代表向前移动,默认值为1。nextPos为移动后在文本中的位置,如果超出文本的长度范围,返回-1 164 let isBoundary: boolean = iterator.isBoundary(offset: number); // 判断offset位置是否是可换行点 165 ``` 166 167 168**开发实例** 169```ts 170// 导入模块 171import { i18n } from '@kit.LocalizationKit'; 172 173// 创建获取文本可换行点的对象 174let iterator: i18n.BreakIterator = i18n.getLineInstance('en-GB'); 175 176// 设置处理文本 177iterator.setLineBreakText('Apple is my favorite fruit.'); 178 179// 将换行迭代器移动到文本起始位置 180let firstPos: number = iterator.first(); // firstPos = 0 181 182// 将换行迭代器向后移动2个可换行点 183let nextPos: number = iterator.next(2); // nextPos = 9 184 185// 判断某个位置是否是可换行点 186let isBoundary: boolean = iterator.isBoundary(9); // isBoundary = true 187 188// 获取BreakIterator对象处理的文本 189let breakText: string = iterator.getLineBreakText(); // breakText = 'Apple is my favorite fruit.' 190``` 191 192### 文件路径镜像处理 193 194文件路径镜像处理是指传入镜像语言时,对文件路径字符串进行本地化处理,实现镜像语言下文件路径的镜像显示效果。使用I18NUtil类的[getUnicodeWrappedFilePath](../reference/apis-localization-kit/js-apis-i18n.md#getunicodewrappedfilepath20)接口可以实现文件路径镜像处理,具体开发步骤如下: 195 1961. 导入模块。 197 ```ts 198 import { i18n } from '@kit.LocalizationKit'; 199 ``` 200 2012. 文件路径镜像处理。 202 ```ts 203 let mirrorPath: string = i18n.I18NUtil.getUnicodeWrappedFilePath(path: string, delimiter?: string, locale?: Intl.Locale); 204 ``` 205 206 207**开发实例** 208```ts 209// 导入模块 210import { i18n } from '@kit.LocalizationKit'; 211 212try { 213 // 传入镜像语言,对路径进行镜像处理 214 let path: string = 'data/out/tmp'; 215 let delimiter: string = '/'; 216 let locale: Intl.Locale = new Intl.Locale('ar'); 217 // mirrorPath = 'tmp/out/data/' 218 let mirrorPath: string = i18n.I18NUtil.getUnicodeWrappedFilePath(path, delimiter, locale); 219 220 // 传入非镜像语言,不处理路径 221 let localeZh: Intl.Locale = new Intl.Locale('zh'); 222 // unMirrorPath = '/data/out/tmp' 223 let unMirrorPath: string = i18n.I18NUtil.getUnicodeWrappedFilePath(path, delimiter, localeZh); 224} catch (error) { 225 console.error(`call I18NUtil.getUnicodeWrappedFilePath failed, error code: ${error.code}, message: ${error.message}.`); 226} 227``` 228<!--RP1--><!--RP1End-->