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 '@ohos.i18n'; 20 ``` 21 222. 判断字符属性。 23 24 ```ts 25 let isDigit: boolean = I18n.Unicode.isDigit(char: string); 26 ``` 27 283. 以一般类别值为例,判断字符类类型,具体请参考getType接口文档。 29 30 ```ts 31 let type = I18n.Unicode.getType(char: string); 32 ``` 33 34**开发实例** 35```ts 36// 导入模块 37import I18n from '@ohos.i18n' 38 39// 判断字符是否是数字 40let isDigit = I18n.Unicode.isDigit('1'); // isDigit: true 41 42// 判断字符是否是从右到左语言的字符 43let isRTL = I18n.Unicode.isRTL('a'); // isRTL: false 44 45// 判断字符是否是表意文字 46let isIdeograph = I18n.Unicode.isIdeograph('华'); // isIdeograph: true 47 48// 获取字符的一般类别值 49let type = I18n.Unicode.getType('a'); // type: 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 '@ohos.i18n'; 63 ``` 64 652. 创建Transliterator对象,获取音译列表。 66 ```ts 67 let transliterator: I18n.Transliterator = I18n.Transliterator.getInstance(id: string); // 传入音译支持的ID,创建Transliterator对象 68 let ids: string[] = I18n.Transliterator.getAvailableIDs(); // 获取音译支持的ID列表 69 ``` 70 713. 音译文本。 72 ```ts 73 let res: string = transliterator.transform(text: string); // 对text内容进行音译 74 ``` 75 76 77**开发实例** 78```ts 79// 导入模块 80import I18n from '@ohos.i18n' 81 82// 音译成Latn格式 83let transliterator = I18n.Transliterator.getInstance('Any-Latn'); 84let res = transliterator.transform('中国'); // res: zhōng guó 85 86// 获取音译支持的ID列表 87let ids = I18n.Transliterator.getAvailableIDs(); ids: ['ASCII-Latin', 'Accents-Any', ...] 88``` 89 90 91### 字符标准化 92 93字符标准化是指按指定的范式标准化字符。通过Normalizer类的[normalize](../reference/apis-localization-kit/js-apis-i18n.md#normalize10)接口实现,具体开发步骤如下。 94 951. 导入模块。 96 ```ts 97 import I18n from '@ohos.i18n' 98 ``` 99 1002. 创建标准化对象。传入文本标准化的范式,创建标准化对象,文本标准化的范式包括NFC、NFD、NFKC和NFKD,范式的详细介绍请参考[国际标准](https://www.unicode.org/reports/tr15/#Norm_Forms)。 101 ```ts 102 let normalizer: I18n.Normalizer = I18n.Normalizer.getInstance(mode: NormalizerMode); 103 ``` 104 1053. 文本标准化。 106 ```ts 107 let normalizedText: string = normalizer.normalize(text: string); // 对text文本进行标准化 108 ``` 109 110**开发实例** 111```ts 112// 导入模块 113import I18n from '@ohos.i18n' 114 115// 以NFC范式标准化字符 116let normalizer = I18n.Normalizer.getInstance(I18n.NormalizerMode.NFC); 117let normalizedText = normalizer.normalize('\u1E9B\u0323'); // normalizedText: \u1E9B\u0323 118``` 119 120 121### 断词换行 122 123断词换行是指根据设定的区域参数获取文本中的分割点,通过[BreakIterator](../reference/apis-localization-kit/js-apis-i18n.md#breakiterator8)类的接口实现,具体开发步骤如下。 124 1251. 导入模块。 126 ```ts 127 import I18n from '@ohos.i18n' 128 ``` 129 1302. 创建用于断句的对象。 131 传入合法的locale参数,生成BreakIterator类型的对象,该对象将按照locale所指定的区域的规则进行断句。 132 133 ```ts 134 let iterator: I18n.BreakIterator = I18n.getLineInstance(locale: string); 135 ``` 136 1373. 设置要处理的文本。 138 ```ts 139 iterator.setLineBreakText(text: string); // 设置要处理的文本 140 let breakText: string = iterator.getLineBreakText(); // 查看iterator正在处理的文本 141 ``` 142 1434. 获取可断句的位置。 144 ```ts 145 let currentPos: number = iterator.current(); // 获取iterator在当前所处理文本中的位置 146 let firstPos: number = iterator.first(); // 设置为第一个可断句的分割点,返回该分割点的位置。第一个分割点总是在文本的起始位置,firstPos = 0 147 let nextPos: number = iterator.next(number); // 将iterator移动number数量个分割点,number为正数代表向后移动,number为负数代表向前移动,默认值为1。nextPos为移动后在文本中的位置,如果超出文本的长度范围,返回-1 148 let isBoundary: boolean = iterator.isBoundary(number); // 判断number位置是否是分割点 149 ``` 150 151 152**开发实例** 153```ts 154// 导入模块 155import I18n from '@ohos.i18n' 156 157// 断句对象 158let iterator = I18n.getLineInstance('en-GB'); 159 160// 断句文本 161iterator.setLineBreakText('Apple is my favorite fruit.'); 162 163// 将BreakIterator对象移动到文本起始位置 164let firstPos = iterator.first(); // firstPos: 0 165 166// 将BreakIterator对象移动几个分割点 167let nextPos = iterator.next(2); // nextPos: 9 168 169// 判断某个位置是否是分割点 170let isBoundary = iterator.isBoundary(9); isBoundary: true 171 172// 获取BreakIterator对象处理的文本 173let breakText = iterator.getLineBreakText(); // breakText: Apple is my favorite fruit. 174``` 175