从整数计数器生成URI友好的Unicode代码点

时间:2011-06-05 23:36:36

标签: url unicode utf-8 uri

我需要将整数计数器映射到URI友好的Unicode代码点(我正在编写一个不限于典型的ASCII base-62,0-9a-zA-Z的URL缩短器)。我已经有一个原型工作; Web服务器正在接收对Unicode代码点的%编码UTF-8值的GET请求(无论如何都来自Firefox),因此它很容易处理。

现在,我遇到的困难部分是将缩短的URL的主键 - 一个整数 - 转换为可用的Unicode代码点(代码 points ,当我超过我可以使用的单个代码点的数量时,必须使用多个代码点)。现在我的计数器有时会创建不可用的坏代码点。我读了一下Unicode,我明白有很多事情要考虑:

  • 不可显示的字符
    • Noncharacters
    • 控制代码
    • 高/低代理
    • 私人使用代码点
    • 格式化,比迪字符
  • 合并字符/变音符号
  • 空白
  • 重复/重复的字符
  • URI-scheme reserved字符,例如/+.?(不是Unicode内容)

我的简单解决方案是创建一组映射到的代码点,通过避免上面的“坏字符”范围覆盖尽可能多的可用代码点,并且仅包括本身也包含的代码点grapheme cluster boundaries,即通过组合字符/变音符号不可变(虽然我想如果我将变音符号码列入黑名单,这无关紧要)。这是一个公平的假设吗?是否有一种相对简单的方法来生成这样一组代码点?

我已经看到了unicharsuniprops等工具的链接,但我认为我不了解Unicode属性,无法理解他们是否会在这种情况下帮助我。我对可用代码点的完全详尽列表不感兴趣,但是> 70%的覆盖率会非常棒。我更希望保持“坏”代码点。

我想知道的另一个问题是,是否应该过滤掉保留代码点和/或没有可显示表示的分配代码点(看起来像一个内部带有十六进制值的矩形框)。有趣的是,它们似乎有效,所以我打算让它们进去。有什么好的理由不去吗?

如果我的Unicode术语不正确,请提前道歉。

TL; DR

<小时/> 如何生成可显示的所有Unicode代码点集(无控件/格式代码点), 排除 空格,重复/重复字符以及组合字符/变音符号标记?

2 个答案:

答案 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中的另一个文件。