我需要将整数计数器映射到URI友好的Unicode代码点(我正在编写一个不限于典型的ASCII base-62,0-9a-zA-Z
的URL缩短器)。我已经有一个原型工作; Web服务器正在接收对Unicode代码点的%编码UTF-8值的GET请求(无论如何都来自Firefox),因此它很容易处理。
现在,我遇到的困难部分是将缩短的URL的主键 - 一个整数 - 转换为可用的Unicode代码点(代码 points ,当我超过我可以使用的单个代码点的数量时,必须使用多个代码点)。现在我的计数器有时会创建不可用的坏代码点。我读了一下Unicode,我明白有很多事情要考虑:
/
,+
,.
,?
(不是Unicode内容)我的简单解决方案是创建一组映射到的代码点,通过避免上面的“坏字符”范围覆盖尽可能多的可用代码点,并且仅包括本身也包含的代码点grapheme cluster boundaries,即通过组合字符/变音符号不可变(虽然我想如果我将变音符号码列入黑名单,这无关紧要)。这是一个公平的假设吗?是否有一种相对简单的方法来生成这样一组代码点?
我已经看到了unichars和uniprops等工具的链接,但我认为我不了解Unicode属性,无法理解他们是否会在这种情况下帮助我。我对可用代码点的完全详尽列表不感兴趣,但是> 70%的覆盖率会非常棒。我更希望保持“坏”代码点。
我想知道的另一个问题是,是否应该过滤掉保留代码点和/或没有可显示表示的分配代码点(看起来像一个内部带有十六进制值的矩形框)。有趣的是,它们似乎有效,所以我打算让它们进去。有什么好的理由不去吗?
如果我的Unicode术语不正确,请提前道歉。
<小时/> 如何生成可显示的所有Unicode代码点集(无控件/格式代码点), 排除 空格,重复/重复字符以及组合字符/变音符号标记?
答案 0 :(得分:2)
你问的部分内容可能是不可能的。没有单个字体包含所有Unicode字符的字形,并且大多数系统没有足够的字体来覆盖所有Unicode。因此,如果通过“可显示”表示用户实际上可以看到一个字形,那就是一个问题。
也无法保证两个不同Unicode字符的字形实际上看起来不同,但this file提供有关相似字符的信息(例如,数字符号和音乐清晰符号)。这可能就像你可以过滤掉重复/重复的字符一样接近。
否则,Unicode character database应该为您提供有关每个字符的足够信息,以便您过滤掉您不想要的字符(控制字符,组合字符,空格)。
答案 1 :(得分:1)
我找到的最简单的解决方案是我随机偶然发现的:这个官方的Unicode Properties JSP Web应用程序。我相信这是我使用的查询:
[:Diacritic=No:]&[:Noncharacter_Code_Point=No:]&[:Deprecated=No:]&[:White_Space=No:]&[:General_Category=Math_Symbol:]|[:General_Category=Symbol:]|[:General_Category=Letter:]|[:General_Category=Punctuation:]|[:General_Category=Currency_Symbol:]|[:General_Category=Number:]&[:General_Category!=Modifier_Letter:]&[:General_Category!=Modifier_Symbol:]
产生107,401个代码点。然后我将URI保留字符和其他几个字符过滤掉,以便在将它们存储到我的数据库之前保证安全。这是我的工作prototype,未公布的测试版。
我试过的其他一些事情,但未成功:
我尝试了Perl unichars
实用程序,我相信它有能力做我需要的,但我的Perl版本(5.10.1)链接到Unicode 5.x标准;我无法快速找到升级到Unicode 6.0.0标准的任何说明。我曾考虑编写类似于unichars
的Ruby应用程序,但我的Ruby安装也是基于Unicode 5.2标准(Ruby 1.9.2,ActiveSupport 3.0.8)。我发现a way显然加载了一个不同的Unicode表,但是没有相应的文档,我系统上的unicode_tables.dat
文件是二进制文件,因此没有简单的答案。
我自己也考虑过解析Unicode 6.0.0标准的UnicodeData.txt file,但显然缺少一些代码点,比如Han,这需要我解析its own format中的另一个文件。