常规英语字符的语言特定字符

时间:2013-08-09 20:39:17

标签: php utf-8 ansi

我不知道从哪里开始,但这就是我想要做的事情:

用户有一个文本字段,他们需要输入几个单词。问题是该页面将使用来自不同国家的人,他们将输入“怪异”的拉丁字符,如:ž,Ä,Ü,đ,Ť,Á等。

在保存到基础之前我想将它们转换为z,a,u,d,t,a ...有没有办法做到这一点而不做这样的事情(我认为有太多的字符要覆盖) :

 $string = str_replace(array('Č','Ä','Á','đ'), array('C','A','A','d'), $string);

而且,是的,我知道我可以在数据库中保存utf-8,但问题是此字符串稍后将由SMS发送,并且由于sms协议性质,这些“特殊”字符在消息中使用的空间比常规英文字母字符(我限制为120个字符,如果我在消息中加上“Ä”,则需要超过1个字符)。

2 个答案:

答案 0 :(得分:1)

首先,我仍然会将原始字符存储在数据库中的utf-8中。您可以在检索时始终将它们“翻译”为ASCII字符。这很好,因为如果将来SMS添加了UTF-8支持(或者您希望将用户数据用于其他内容),则原始字符将保持不变。

也就是说,您可以使用iconv来执行此操作:

iconv('utf-8', 'ascii//TRANSLIT', $input);  //where $input contains "weird" characters

有关详细信息,请参阅此主题,包括此方法的一些注意事项:PHP: Replace umlauts with closest 7-bit ASCII equivalent in an UTF-8 string

答案 1 :(得分:1)

关闭但不完美,因为它将重音和事物转换为字符。

http://www.php.net/manual/en/function.iconv.php

 echo iconv("ISO-8859-1", "ASCII//TRANSLIT", 'Martín');
 //output: Mart'in

 echo iconv("ISO-8859-1", "ASCII//TRANSLIT", "ÆÇÈÊÈÒÐÑÕ");
 //output: AEC`E^E`E`OD~N~O

使用

 echo iconv('utf-8', 'ascii//TRANSLIT', 'Martín'); 
 //output: Mart

如果重音字符不是UTF-8,它只会从特殊字符串开始切断字符串。