如何获取文档指定行的列数(用户感知字符/grapheme clusters)
我发现Document对象的GetLines方法可以获取文档行数,但找不到获取指定行**用户感知字符(grapheme clusters)**对应列数的方法。
Document对象的GetColumns方法不适用,因为它仅在CSV模式下返回列数,非CSV模式下返回0。
关于列的定义:
列数是从上一个换行符开始的字符数,若为文档第一行则从文档开头算起。
给定整数i,我需要获取文档第i行最右侧列的逻辑坐标(X轴位置)。例如某文本文件内容如下:
123 test 1 abcdefghij test 2
第三行的列数为11:j的1-based索引是10,加上光标右移一步的位置。
我考虑过使用Javascript的Intl.Segmenter方法,但它并非原生内置方法,不确定是否与程序内部的字符表示完全一致。
编辑说明
需要澄清一个容易混淆的点:
一行的code points(码点)数量不等于列数,列数对应行内grapheme clusters(grapheme簇)的数量,也就是该行最后一个grapheme cluster的逻辑坐标。例如某行包含以下4个code points:
- U+0041: 大写拉丁字母A;
- U+0301: 组合尖音符;
- U+0065: 小写拉丁字母E;
- U+0301: 组合尖音符。
该行显示为:
Áé
Javascript中的length属性对我没用,因为它统计的是code points数量而非grapheme clusters(有时Unicode归一化也无法解决):
"Áé".length === 4 //true
但该行最后一个grapheme cluster的逻辑坐标仅为2,即é是第二列,光标可移至该列右侧,此时程序显示当前列是3,而该行的code points数量为4:
Code points通常用于字符编码,是映射到特定字符的数值,通常代表单个grapheme(字母、数字等),但有时代表符号、控制字符或格式。
我的核心问题是:获取行内最后一个grapheme cluster的逻辑坐标,该值比列数少1(因为每行最后一个grapheme cluster右侧至少有一个空列):
需要注意,用户认为的“字符”(书写系统的基本单位)可能并非单个Unicode code point,而是由多个code point组成的user-perceived character(用户感知字符)。例如“G”+重音符是一个用户感知字符,用户视为单个字符,但实际由两个Unicode code point组成。这些用户感知字符由grapheme cluster近似表示,可通过编程确定。
程序窗口底部会显示该数值,但似乎没有原生方法可将其作为行属性访问。
内容的提问来源于stack exchange,提问作者lyrically wicked

