iconv给出了"非法人物"的智能引号 - 如何摆脱它们?

And*_*ift 7 mysql utf-8 iso-8859-1 smart-quotes iconv

我有一个MySQL表,其中120,000行以UTF-8格式存储.有一个字段,产品名称,包含带有许多重音的文本.在将其转换为友好的URL形式(ASCII)后,我需要使用相同的名称填充第二个字段.

由于PHP不直接处理UTF-8,我使用:

$value = iconv ('UTF-8', 'ISO-8859-1', $value);

将名称转换为ISO-8859-1,然后是一个巨大的strstr语句,用其非重音等效项替换任何重音字符(例如,à变为a).

但是,原始文本名称是使用智能引号输入的,而且每当遇到一个时,iconv会发出窒息 - 我得到:

Unknown error type: [8]

iconv() [function.iconv]: Detected an illegal character in input string

为了在使用iconv之前删除智能引号,我尝试使用三个语句,如:

$value = str_replace('’', "'", $value);

(是UTF-8智能单引号的原始值)

因为文本文件太长,所以这些str_replace会导致脚本每次都超时.

  1. 在运行iconv之前,从UTF-8字符串中删除智能引号(或任何无效字符)的最快方法是什么?

  2. 或者,这个问题是否有更简单的解决方案?将具有多个重音符号(UTF-8)的名称转换为没有重音符号,拼写正确的ASCII格式的最快方法是什么?

eph*_*ent 6

Glibc(和GNU libiconv)支持 //TRANSLIT//IGNORE后缀.

因此,在Linux上,这很好用:

$ echo $'\xe2\x80\x99'
’
$ echo $'\xe2\x80\x99' | iconv -futf8 -tiso8859-1
iconv: illegal input sequence at position 0
$ echo $'\xe2\x80\x99' | iconv -futf8 -tiso8859-1//translit
'

我不确定iconvPHP使用了什么,但文档暗示//TRANSLIT并且//IGNORE也将在那里工作.


cha*_*cus 2

“链接友好”是什么意思?对我来说唯一有意义的方法是,因为<a>...</a>标签之间的文本可以是任何内容,实际上是“URL友好”,类似于SO的URL,其中所有内容都转换为[a-z-].

如果这就是您想要的,您将需要一个音译库,而不是字符集转换库。(过去我没有运气让 iconv() 来完成这项工作,但我有一段时间没有尝试过。)有一个 beta PHP 扩展translit可能可以完成这项工作

如果您无法向 PHP 安装添加扩展,则必须寻找具有相同功能的 PHP 库。我还没有使用过它,但PHP UTF-8库实现了一个utf8_to_ascii库,我认为它可以完成您需要的功能。

(此外,如果 iconv() 像您所说的那样失败,则意味着您的输入实际上不是有效的 UTF-8,因此用其他任何内容替换有效的 UTF-8 都无法解决问题。编辑:我可以认为返回:如果ephemient 的答案是正确的,您看到的 iconv 错误很可能是因为目标字符集中没有直接表示该字符。所以,没关系。)