繁体   English   中英

带有ascii的iconv //传输触发ErrorException:“ iconv():在输入字符串中检测到非法字符”

[英]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")或类似名称。

关于HTML表单

因为您在问题的评论中询问。 数据如何发送到服务器与用户在操作系统中设置的语言环境无关。 它与客户端的浏览器有关。 发送表单数据时,所有现代浏览器均默认为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM