消毒/替换所有日语,中文韩语,俄语等字符

时间:2012-08-06 16:02:48

标签: php regex

我有清理网址和文件名的功能,它适用于éáßöäü这样的字符,因为它会使用eassoau替换为str_replace($a, $b, $value)等。{{1}}。但是如何用中文,日文......语言替换所有字符?如果由于不容易确定而无法替换,我该如何删除所有这些字符?当然,我可以像上面那样首先清理它,然后删除所有“非拉丁”字符。但也许有另一个好的解决方案呢?

修改/添加

如评论中所述:我的问题的目的是什么?我们的客户首先拥有英语,德语和俄语的内容。后来出现了一些中文页面。网址出现两个问题:

  • 第一个清洁剂杀死所有'非ascii-characters'并可能返回'blank'(无效)clean-URLs
  • 客户端经历过,在某些浏览器中,带有中文字符的干净URL无法正常工作

第一点引导我去替换那些角色,当然,正如问题中所述并且评论证实了这一点,这是不可能的。也许现在有人在所有现代浏览器中都回答这个问题(从IE8开始)这不再是一个问题了。我也很高兴听到这个消息。

3 个答案:

答案 0 :(得分:2)

你可以通过现有的消毒剂运行它,然后任何不拉丁的东西,你可以转换为punycode

答案 1 :(得分:2)

至于日语,作为一个例子,通常有一个 romanji 表示所有只使用ascii字符的东西,并且仍然给出了原始字符的可逆和可理解的表示。然而,将某些内容翻译成romanji需要您知道正确的发音,这通常取决于使用字符的含义或上下文。这使得简单地转换所有内容(或者至少不能有效地用于简单的消毒剂)很难(如果不是不可能的话)。

这同样适用于中国人,甚至更糟。另一方面,韩语有一个非常简单的字符集,应该可以很容易地翻译成罗马字母表。另一个常见问题是没有罗马化方法;这些语言通常有不同的人使用(例如日语有两种常见的罗马语)。

所以这取决于你正在使用的实际语言;虽然你可能能够使它适用于某些语言,但另一个问题是检测你实际使用的是哪种语言(例如日语和中文共享很多字符,但意义,发音和罗马化语通常是不相容的)。特别是对于文件名的简单 santization ,我认为投入如此大量的工作和处理时间并不值得。

也许你应该朝着不同的方向努力:让你的文件名只是作为unicode文件名工作。实际上,在文件系统(*|\/:"<>?)中实际上只有极少数字符真正无效,因此简单地过滤掉这些字符并以其他方式支持unicode文件名会更容易。

答案 2 :(得分:1)

因此,据我所知,您需要为每种语言使用一些字符关系表,并在此表中按关系替换字符 例如,对于translit俄语符号到latin同义词,我们使用这个表=)或类,使用这个表=)
这是有意义的,我现在发现它http://derickrethans.nl/projects.html#translit