gpt4 book ai didi

PHP Curly Quote 字符编码问题

转载 作者:可可西里 更新时间:2023-11-01 07:14:57 25 4
gpt4 key购买 nike

我知道不同字符集之间的字符编码存在一个由来已久的问题,但我一直停留在与 Window 的“大引号”相关的问题上。

我们有一个客户喜欢将数据复制并粘贴到文本字段中,然后将其发布到我们的应用程序中。该数据通常会包含弯引号。我曾经使用以下方法将它们转换为正常的对应物:

function convert_smart_quotes($string)  { 

$badwordchars=array("\xe2\x80\x98", "\xe2\x80\x99", "\xe2\x80\x9c", "\xe2\x80\x9d", "\xe2\x80\x93", "\xe2\x80\x94", "\xe2\x80\xa6");

$fixedwordchars=array("'", "'", '"', '"', '-', '--', '...');

return str_replace($badwordchars,$fixedwordchars,$string);

}

几个月来效果很好。然后经过一些更改(我们切换服务器、更新系统、升级 PHP 等)后,我们了解到它不再起作用了。所以,我看了一下,发现“弯引号”都变成了不同的字符。在这种情况下,它们将变成以下内容:

“=¡È

”=¡É

' = ¡È

’ = ¡Ç

当保存在数据库中时,这些字符会显示为该死的“黑色菱形问号符号”。 mySQL 数据库位于 latin1_swedish_ci 中,接收消息的应用程序也是如此。因此,尽管我知道 utf-8 更好,但它必须保留在 latin1_swedish_ci 或 ISO-8859-1 中,否则我们将不得不重建所有内容……这是不可能的。

我的网页和表单都以 utf-8 格式发布。如果我将其更改为 ISO-8859-1,引号就会变成问号。

我曾尝试在字符串中搜索出现的“¡È”或“¡É”并将它们替换为普通引号,但我无法让它工作。我通过在上面的函数中添加以下内容来做到这一点:

$string = str_replace("xa1\xc8", '"', $string);
$string = str_replace("xa1\xc9", '"', $string);
$string = str_replace("xa1\xc6", "'", $string);
$string = str_replace("xa1\xc7", "'", $string);

我已经被困在这个问题上几个小时了,一直无法在线找到任何真正的帮助。可以想象,用谷歌搜索“¡É”不会带来非常具体的响应。

感谢任何指导!

最佳答案

您的问题是您正在接受来自用户的 UTF-8 输入,然后将其插入到您的数据库中,就好像它是 Latin1 (ISO-8859-1)。 (请注意,latin1_swedish_ci 不是编码,而是整理(对于 Latin1)。参见 this SO question on the difference。为了解决您的角色 em>encoding问题,排序不重要。)

与其手动识别重要的 UTF-8 序列并替换它们,不如使用可靠的方法将 UTF-8 字符串转换为 Latin1,例如 iconv .

请注意,这是一个有损转换:某些 UTF-8 字符(例如大引号)在 Latin1 中不存在。您可以选择忽略这些字符(将它们替换为空字符串、? 或其他字符),或者您可以选择音译它们(将它们替换为相近的等值字符,例如 " 用于大引号...但是如果有人将 放入您的表单中,您会怎么做?

iconv 将尝试在可能的地方进行音译:

// convert from utf8 to latin1, approximating out of range characters
// by the closest latin1 alternative where possible (//TRANSLIT)
$latinString = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $utf8String);

(您还可以将其配置为忽略所有超出范围的字符 — 有关更多信息,请参阅 iconv's documentation。)

如果您不想添加新库,PHP 还附带了 utf_decode功能:

$latinString = utf_decode($utf8String);

但是,PHP 在设计时并没有真正考虑到多种字符编码,因此我更愿意远离处理编码的(有时是错误的)标准库函数。

您还应该考虑阅读 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) .

关于PHP Curly Quote 字符编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21716929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com