代码之家  ›  专栏  ›  技术社区  ›  bustrofedon

Slugs和Unicode规则

  •  10
  • bustrofedon  · 技术社区  · 15 年前

    在研究了一点人们敲打标题的不同方式之后,我注意到它经常缺少如何处理非英语标题。

    URL编码是非常严格的。见 http://www.blooberry.com/indexdot/html/topics/urlencoding.htm

    例如,人们如何处理诸如

    “UNA L_ Grima Cay_3;en la Arena”

    我们可以为印欧语系(即可以通过ISO-8859-1编码的语言)提供一个合理的表。例如,转换表将转换为“_”=>“A”,因此slug将

    “una lagrima cayo en la arena”

    但是,我使用的是Unicode(特别是使用UTF-8编码),所以我不能保证我将得到什么样的排序代码点(我必须为那些不能被ISO-8859-1编码的代码做好准备)。

    我是纳舒尔。怎么处理这个?我是否应该为iso_-1范围(<255)中的字符创建一个转换表,并删除其他所有字符?

    编辑 :为了提供更多的上下文和先验信息,我不希望用非印欧语系的语言来处理数据,但是如果遇到这样的数据,我想有一个计划。 一个扩展的ASCII转换表是很好的。有什么指针吗?

    另外,由于人们问,我使用的是python,运行在谷歌应用引擎上。

    4 回复  |  直到 15 年前
        1
  •  8
  •   zgoda    15 年前

    几乎完整的音译表(拉丁语、希腊语和西里尔文字符集)可以在 slughifi library .它面向Django,但可以很容易地修改以满足一般需求(我将它与基于Werkzeug的Appengine应用程序一起使用)。

        2
  •  4
  •   felixg    15 年前

    我只是使用UTF-8作为URL路径。只要域不是IDN FF3,就可以使用它。谷歌正确地读取和显示它们。这个 IRI RFC 允许Unicode。只需确保正确解析传入的URL即可。

        3
  •  2
  •   bdonlan    15 年前

    一般来说,这取决于你期望得到的语言。如果您的主要用户群是日语,那么删除除ISO-8859-1字符以外的所有字符就不太可能了。

    也就是说,如果您的字符集转换库支持,那么一个选项可能是使用音译模式。例如,使用GNU ICONV,可以执行以下操作:

    ] echo Una lágrima cayó en la arena|iconv -f utf8 -t ascii//TRANSLIT
    Una lagrima cayo en la arena
    

    如您所见,重音字符被自动转换为ASCII范围内的某个字符。当然,如何将其转换为代码将取决于您使用的语言,但是如果您的语言基于GNU ICONV进行字符集转换(如果它在Linux上,则很可能是这样),那么只需指定“ascii//translit”作为转换为字符集,就可以直接应用此技巧。

    然而,需要注意的一点是,它只对ASCII中“看起来”的字符有效。例如:

    ] echo 我輩は猫である。名前はまだない。|iconv -f utf8 -t ascii//TRANSLIT                                               
    ????????????????
    

    如您所见,它对日文没有太大帮助,之后需要进一步处理以删除不适合URL的字符。

        4
  •  1
  •   alex    15 年前

    如果所有其他方法都失败了,您可以使用转换表,但可能有一个性能更好的解决方案可用。您使用的服务器端语言是什么?