- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我知道不同字符集之间的字符编码存在一个由来已久的问题,但我一直停留在与 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 在设计时并没有真正考虑到多种字符编码,因此我更愿意远离处理编码的(有时是错误的)标准库函数。
关于PHP Curly Quote 字符编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21716929/
curl curl 新方法整理评测is explained in this article .给出了几个例子来展示这种非标准评估(NSE)风格的使用。 library(tidyverse) # Exa
我想要一个小标题(或数据框),将其中一列转换为数字,只选择同一列加上第三列,然后过滤掉 NA。 给定以下数据: library(tidyverse) set.seed(1) mytib % m
在Scala中,我可以定义一个带有两个参数列表的函数。 def myAdd(x :Int)(y :Int) = x + y 这使定义部分应用的功能变得容易。 val plusFive = myAdd(
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicates: Formatting of if Statements Is there a best coding styl
我设置了自定义光标url(mouse2.cur)并且它没有改变。 (mouse2.png) 完美运行!有什么问题吗? body{ cursor: url(mouse2.cur),pointer
我设置了自定义光标url(mouse2.cur)并且它没有改变。 (mouse2.png) 完美运行!有什么问题吗? body{ cursor: url(mouse2.cur),pointer
我正在 python 中执行 SQL 查询。表示重复参数的正确方法是什么?示例:我有 cur.execute("""select * from TableA where field1= '{}' an
我正在 Visual Studio 2015 中的 Winforms 应用程序中使用 C#。 在我的应用程序中,我有一个返回光标类型的函数,我想将此光标保存到 .cur 文件中。 这是我的代码: pu
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有以下功能,可以批量插入 IPv6 IP 列表 def insertToDb(ipList): print("OK") try: conn = psycopg2.connect("d
我可以找到几种在 win32 中创建游标的方法,但我需要第三种,但我找不到。 我能找到的第一个是使用 LoadXXX() 打开文件或资源并以这种方式加载光标。 我能找到的第二个是使用 CreateCu
我正在学习 c#(和它的 OOP),我在 Visual Studio 中运行以下程序,它不断弹出一个错误,它需要一个花括号 } 我有写在这里。我想不通它为什么要那样。 using System; us
我知道不同字符集之间的字符编码存在一个由来已久的问题,但我一直停留在与 Window 的“大引号”相关的问题上。 我们有一个客户喜欢将数据复制并粘贴到文本字段中,然后将其发布到我们的应用程序中。该数据
我将文本存储在 post_title 列中: you’re 使用这个查询: function ma_post_title_filter($where, &$wp_query) { global
显示双花括号之间多个翻译的标签。 我在 Magento 2 的前端和后端都有这个问题。 这是我迄今为止尝试过的: 清除并刷新缓存 重新部署的静态内容 将 Magento 2.2.5 更新为 2.2.6
这个问题在这里已经有了答案: Use dynamic variable names in `dplyr` (9 个回答) 去年关闭。 我在 group_by 中使用了 curl-curly和 summ
IE浏览器,这个: if (x > 5) return test; 总是会变成: if (x > 5) { return test; } 我不是在谈论大括号样式(Allman、GNU、Whit
这个问题已经有答案了: regular expression does not work with javascript (2 个回答) How do I replace all occurrence
scala coding standards说明 Technically, Scala’s parser does support GNU-style notation with opening br
curs.execute("Select ISBN,Rate From High_Scores") rows2 = curs.fetchall() for row in rows2: Book
我是一名优秀的程序员,十分优秀!