[英]iconv with ascii // transit triggers ErrorException: “iconv(): Detected an illegal character in input string”
首先,我必须这样说; 我是多语言转换的陌生人。
我有一些字符串,如果可能的话,我想以utf-8格式mb_lowercase(例如干净的url),我使用
$str = iconv("UTF-8", "ASCII//TRANSLIT", utf8_encode($str));
$str = preg_replace("/[^a-zA-Z0-9_]/", "", $str);
$str = mb_strtolower($str);
达到我的要求(UTF8,小写字符串)
但是,当我使用CocoaRestClient通过“çokGüŞelLl”强调该功能时; 我得到$ str(感谢我的客户端?),iconv触发一个错误,抱怨输入字符串(Ã)中存在非法字符。
iconv有什么问题? str已经被utf8_encode($str)
编码为utf8了。 怎么可能是非法字符?
注意:我在这里阅读了有关@iconv问题的信息,但是我认为拥有空数据库条目不是一个好的解决方案。
感谢所有答案,我将阅读并尝试理解每个答案。
PHP函数utf8_encode()
您的字符串采用ISO-8859-1编码。 如果不是,那么您会得到有趣的结果。
在将数据保存到数据库之前 ,请确保其数据为正确的UTF-8:
// Validate that the input string is valid UTF-8
if (preg_match("//u", $string) === false) {
throw new \InvalidArgumentException("String contains invalid UTF-8 characters.");
}
// Normalize to Unicode NFC form (recommended by W3C)
$string = \Normalizer::normalize($string);
现在,所有内容都以相同的方式存储在我们的数据库中,从数据库接收数据时,我们不必再担心这个问题。
$string = $database->getSomeRecordWithUnicode();
echo mb_strtolower($string);
做完了!
PS:如果要确保数据库使用与PHP完全相同的编码,请使用utf8mb4
作为字符集(以及utf8mb4_unicode_ci
作为用于完美排序的默认排序规则)或BLOB
(二进制)数据类型。
PPS:使用您的数据库配置文件强制对所有字符串进行正确编码,而不要使用例如$mysqli->set_charset("utf8")
或类似名称。
因为您在问题的评论中询问。 数据如何发送到服务器与用户在操作系统中设置的语言环境无关。 它与客户端的浏览器有关。 发送表单数据时,所有现代浏览器均默认为utf-8
。 如果您担心某些客户使用的浏览器完全损坏,只需告诉他们您只接受utf-8
。 Drupal在所有形式上都这样做。
<!doctype html>
<html>
<body>
<form accept-charset="UTF-8">
现在,所有浏览器都应该将其提交的数据编码为utf-8
。
如果将çokGüŞelLl
编码为UTF-8,则应获取以下字节:
var_dump( bin2hex('çokGüŞelLl') );
string(26) "c3a76f6b47c3bcc59e656c4c6c"
那是您必须做的检查。 你也有这个:
utf8_encode($str)
您的字符串包含Ş
,不能以ISO-8859-1开头。
因此,无论出于何种原因要将原始UTF-8(存储在数据库中)转换为ISO-8859-1,恐怕都会破坏您的数据。
您是双重编码。 首先,将数据库设置为UTF-8。 这意味着您的数据现在已采用UTF-8编码。 然后,您可以在iconv函数上使用utf8_encode。 但是您的输入已经是UTF-8。 尝试从iconv中删除utf8_encode语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.