【问题标题】:remove all non-ASCII from string从字符串中删除所有非 ASCII
【发布时间】:2012-02-26 17:51:15
【问题描述】:

我的问题是一般性的 - 我想问一下编程语言中是否有任何特殊模块或现成的程序可以让我完成我的任务。

有没有什么方便的方法(除了用多个替换语句编写自己的函数)自动将所有国家字符替换为对应的字母?例如,我想将 æ 替换为 aeä 替换为 aęe 等等。

如果无法准备通用函数,那么当前使用的编程语言中是否有现成的函数,只需将允许的字符限制为标准拉丁字母表中的字符即可删除这些字符?

【问题讨论】:

  • 这需要更详细的信息。你在什么平台和文件系统上?以及您为什么要首先这样做 - 您在使用这些特殊字符时遇到了什么问题?
  • 常见的问题:你为什么要这样做?您丢失了信息,因为“对应的”ASCII 字母对于某些语言环境可能是一个愚蠢的概念。特别是对于文件名,基本上只有两件事是有意义的:UTF-16 用于 Windows,UTF-8 用于 Unices。以一种或另一种方式使用其他一切都是一团糟。
  • 标准的拉丁字母大约有 600 个字符,你知道的。我必须回应来自@schlenk 的询问——你到底为什么要做这件邪恶的事情?文化的狭隘性令人叹为观止。
  • 是的,你是对的。我只想使用我可以在键盘上看到的字母。问题的答案很简单——我使用的系统在对文件名中包含一些特殊字符的文件进行操作时会崩溃。

标签: unicode ascii filenames transliteration truncation


【解决方案1】:

unidecode,可用于多种语言(perl、python、java)。我之前写过in this answer

>>> from unidecode import unidecode
>>> unidecode(u"İstanbul")
'Istanbul'
>>> unidecode(u"\u5317\u4EB0")
'Bei Jing '

【讨论】:

    【解决方案2】:

    音译是您要查找的单词:)

    在php中,是通过iconv实现的: http://php.net/manual/en/function.iconv.php

    正如其他人所说,如果可能,最好将所有内容保留为 Unicode(utf8 或 16)。

    【讨论】:

      【解决方案3】:

      我现在不知道你使用的是什么语言,但在 php 中你可以做

      $text = preg_replace("/[^a-zA-Z0-9]+/", "", $text);
      

      您可以更改 reg exp 以允许更多/更少字符。

      【讨论】:

      • 这使得包含变音符号等的字符串非常难看。
      【解决方案4】:

      在 PHP 中,您可以扫描目录中的文件:

      <?php
      $dir = '';
          if ($handle = opendir($dir)) {
          while (false !== ($file = readdir($handle))) {
              if ($file[0] == '.' || is_dir($dir.'/'.$file)) {
                  continue;
              }
      //functions here
          }
          closedir($handle);
      }
      ?>
      

      然后用这个正则表达式重命名它们:

      $newname = ereg_replace("[^A-Za-z0-9]", "", $oldname);
      

      您可以将 $oldname 设置为目录中每个文件的文件名,并将其放在 //functions 所在的位置,这将遍历目录中的每个文件并根据正则表达式对其进行重命名。

      【讨论】:

      • 然后你将有一个空白文件名,你可以设置一个 if-then 语句,或者这样做:pat = array('e' =&gt; '[eéèêë]','n' =&gt; '[nñ]','o' =&gt; '[oòóôõö]','a' =&gt; '[aàáâãäå]','i' =&gt; '[iìíîï]','u' =&gt; '[uùúûü]','y' =&gt; '[yýÿ]');preg_replace("/".$pat['e']."/i",'#',$string); 我记得看到如何使用西里尔字符来做到这一点,我试图找到它所在的站点。编辑 - 这里:pastebin.com/raw.php?i=X1NAsnrJ
      【解决方案5】:

      如果您的输入是 Unicode,您可以应用 Unicode normalization NKFD 来近似您想要的。 Python 有这个built-in。标准化后,您可以去除重音符号,这将与它们所属的字母分开。

      >>> import unicodedata
      >>> s = u"äçéì"  # u"" makes a Unicode string in Python 2.x
      >>> unicodedata.normalize("NFKD", s).encode("ascii", errors="ignore")
      'acei'
      

      不过,这对 æ 不起作用。

      【讨论】:

        猜你喜欢
        • 2010-12-04
        • 1970-01-01
        • 1970-01-01
        • 2011-03-13
        • 1970-01-01
        • 2012-01-21
        • 2023-03-18
        • 2018-07-30
        相关资源
        最近更新 更多