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