在unicode代码点列表中查找连续范围

在unicode代码点列表中查找连续范围,unicode,codepoint,unicode-range,Unicode,Codepoint,Unicode Range,我有一个unicode代码点列表,大致如下(不是一个实际的集合,只是问题说明): 我需要找到适合这些的方法。此集合的某些部分是连续的,缺少一些点-因此范围不是U+050B-1EA0。 有没有一种合理的方法来提取这些连续的“子范围”?我不知道有什么“现成的”,但很容易计算。下面查找连续数字并使用Python构建一个unicode范围: 重新导入 def构建范围(uni): ''传递要包含在unicode范围内的已排序正整数列表。 ''' uni.append(-1)#sentinel防止对最后一个

我有一个unicode代码点列表,大致如下(不是一个实际的集合,只是问题说明):

我需要找到适合这些的方法。此集合的某些部分是连续的,缺少一些点-因此范围不是
U+050B-1EA0
。 有没有一种合理的方法来提取这些连续的“子范围”?

我不知道有什么“现成的”,但很容易计算。下面查找连续数字并使用Python构建一个
unicode范围

重新导入
def构建范围(uni):
''传递要包含在unicode范围内的已排序正整数列表。
'''
uni.append(-1)#sentinel防止对最后一个元素进行特殊处理
开始,uni=uni[0],uni[1:]
电流=启动
字符串=[]
对于uni中的u:
如果u==当前:#如果是重复的
持续
如果u==当前+1:#在连续范围内。。。
电流=u
elif start==当前:#单个元素
追加(f'U+{current:X}')
开始=电流=u
其他:#范围
append(f'U+{start:X}-{current:X}')
开始=电流=u
返回'unicode范围:'+','.join(strings)+';'
数据=“”\
uni050B
uni050C
uni050D
uni050E
uni050F
uni0510
uni0511
uni0512
uni0513
uni1E00
uni1E01
uni1E3E
uni1E3F
uni1E80
uni1E81
uni1E82
uni1E83
uni1E84
uni1E85
uni1EA0''
#将十六进制值解析为整数列表
uni=sorted([int(x,16)for x in re.findall(r'uni([0-9A-F]{4}),data)])
打印(构建范围(uni))
输出:

unicode范围:U+50B-513、U+1E00-1E01、U+1E3E-1E3F、U+1E80-1E85、U+1EA0;
我不知道什么是“现成的”,但计算起来很容易。下面查找连续数字并使用Python构建一个
unicode范围

重新导入
def构建范围(uni):
''传递要包含在unicode范围内的已排序正整数列表。
'''
uni.append(-1)#sentinel防止对最后一个元素进行特殊处理
开始,uni=uni[0],uni[1:]
电流=启动
字符串=[]
对于uni中的u:
如果u==当前:#如果是重复的
持续
如果u==当前+1:#在连续范围内。。。
电流=u
elif start==当前:#单个元素
追加(f'U+{current:X}')
开始=电流=u
其他:#范围
append(f'U+{start:X}-{current:X}')
开始=电流=u
返回'unicode范围:'+','.join(strings)+';'
数据=“”\
uni050B
uni050C
uni050D
uni050E
uni050F
uni0510
uni0511
uni0512
uni0513
uni1E00
uni1E01
uni1E3E
uni1E3F
uni1E80
uni1E81
uni1E82
uni1E83
uni1E84
uni1E85
uni1EA0''
#将十六进制值解析为整数列表
uni=sorted([int(x,16)for x in re.findall(r'uni([0-9A-F]{4}),data)])
打印(构建范围(uni))
输出:

unicode范围:U+50B-513、U+1E00-1E01、U+1E3E-1E3F、U+1E80-1E85、U+1EA0;

我不确定您在做什么,但可能您不是在使用Unicode代码点,而是在使用glyph(通常情况下很复杂)。在这种情况下,字体处理库和工具可能会有所帮助。另外一点:你的问题不完全清楚:你在问什么?通用算法很简单,但您可能正在寻找特定的语言和库?在这种情况下,包含相关的语言标记是很有用的。我不确定您在做什么,但可能您不是在使用Unicode代码点,而是在使用glyph(通常情况下很复杂)。在这种情况下,字体处理库和工具可能会有所帮助。另外一点:你的问题不完全清楚:你在问什么?通用算法很简单,但您可能正在寻找特定的语言和库?在这种情况下,包含相关的语言标记是有用的。
uni050B
uni050C
uni050D
uni050E
uni050F
uni0510
uni0511
uni0512
uni0513
uni1E00
uni1E01
uni1E3E
uni1E3F
uni1E80
uni1E81
uni1E82
uni1E83
uni1E84
uni1E85
uni1EA0
and so forth…