2012-02-26 2 views
1

Мой вопрос вообще - я хочу спросить, есть ли какие-либо специальные модули в языках программирования или готовая программа, которая позволит мне выполнить мою задачу.удалить все не-ASCII из строки

Есть ли удобный способ (кроме написания собственных функций с несколькими операторами замены), чтобы автоматически заменить все национальные символы на письма-корреспонденты? Например, я хочу, чтобы заменить æ к ае, ä к , ę к е и так далее.

Если невозможно подготовить универсальную функцию, есть ли какая-либо готовая функция в используемых в настоящее время языках программирования, которая удалит такие символы, просто ограничив разрешенный символ только теми, кто имеет стандартный латинский алфавит?

+1

Для этого требуется более подробная информация. С какой платформой и файловой системой вы работаете? И почему вы хотите сделать это в первую очередь - с какими проблемами вы сталкиваетесь с этими специальными персонажами? –

+2

Обычный вопрос: Почему вы хотите это сделать? Вы теряете информацию, поскольку «соответствующие» буквы ASCII могут быть глупой концепцией для некоторых локалей. Особенно для имен файлов есть в основном только две вещи, которые имеют смысл: UTF-16 для Windows, UTF-8 для Unices. Все остальное - полный беспорядок, который нужно использовать так или иначе. – schlenk

+0

** В стандартном латинском алфавите есть около 600 символов, ** вы знаете.Я должен повторить запрос от @schlenk - почему в мире вы хотели бы сделать эту злую злую вещь? Культурная узость удивительно примитивна. – tchrist

ответ

1

транслитерации слово, которое вы ищете :)

В PHP, что достигается за счет Iconv: http://php.net/manual/en/function.iconv.php

Как уже сказал, это, вероятно, лучше держать все в Unicode (utf8 или 16), если это возможно.

0

Я теперь не какой язык вы используете, но в PHP вы можете сделать

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

вы можете изменить рег ехр, чтобы больше/меньше символов.

+0

Это делает строки, содержащие umlauts и т. Д. Довольно уродливыми. – ThiefMaster

0

В 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); 

Вы бы установить $ Старое_имя к имени каждого файла в каталог, и у него есть //functions, который будет проходить через каждый файл в каталоге и переименовывать его в соответствии с регулярным выражением.

+0

Что делать, если $ oldname = 'была' – Greg

+0

Тогда у вас будет пустое имя файла, и вы можете установить оператор if-then или сделать это: 'pat = array ('e' => '[eéèêë]', 'n '=>' [nñ] ',' o '=>' [oòóôõö] ',' a '=>' [aàáâäääå] ',' i '=>' [iìíîï] ',' u '=>' [uùúûü ] ',' y '=>' [yýÿ] '); 'и' preg_replace ("/".$ pat [' e ']."/i ",' # ', $ string);' Я помню, как чтобы сделать это с кириллическими символами, и пытаюсь найти сайт, где он был. EDIT - здесь: http://pastebin.com/raw.php?i=X1NAsnrJ – ionFish

0

Если ваш вход 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' 

Это не сработает для æ.

2

Существует unidecode, который доступен для нескольких языков (perl, python, java). Я уже писал об этом in this answer.

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