- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
PHP 并不总是正确的,我写的必须总是正确的。在这种情况下,带有主题的电子邮件包含 en dash character .这个线程是关于检测奇怪的字符,当单独(比方说,在其他纯 ASCII 文本中)被 PHP 错误地检测到。我已经确定了一个静态示例,但我的目标是创建一个包含尽可能接近我们可能创建的插入代码版本的最终线程。
这是我从电子邮件主题 header 开始的字符串:
<?php
//This is AFTER exploding the : of the header and using trim on $p[1]:
$s = '=?ISO-8859-1?Q?orkut=20=96=20convite=20enviado=20por=20Lais=20Piccirillo?=';
//orkut – convite enviado por Lais Piccirillo
?>
通常下一步是执行以下操作:
$s = imap_mime_header_decode($s);//orkut � convite enviado por Lais Piccirillo
通常超过那个点我会做以下事情:
$s = mb_convert_encoding($subject, 'UTF-8', mb_detect_encoding($s));//en dash missing!
现在我收到了 a static answer for an earlier static question .最终我能够将这组工作代码放在一起:
<?php
$s1 = '=?ISO-8859-1?Q?orkut=20=96=20convite=20enviado=20por=20Lais=20Piccirillo?=';
//Attempt to determine the character set:
$en = mb_detect_encoding($s1);//ASCII; wrong!!!
$p = explode('?', $s1, 3)[1];//ISO-8859-1; wrong!!!
//Necessary to decode the q-encoded header text any way FIRST:
$s2 = imap_mime_header_decode($s1);
//Now scan for character exceptions in the original text to compensate for PHP:
if (strpos($s1, '=96') !== false) {$s2 = mb_convert_encoding($s2[0]->text, 'UTF-8', 'CP1252');}
else {$s2 = mb_convert_encoding($s2[0]->text, 'UTF-8');}
//String is finally ready for client output:
echo '<pre>'.print_r($s2,1).'</pre>';//orkut – convite enviado por Lais Piccirillo
?>
现在要么我的编程仍然不正确,要么 在 PHP 中我遗漏了一些东西(尝试了 html_entity_decode
、iconv
的多种组合>、mb_convert_encoding
和 utf8_encode
) 或者,至少在目前使用 PHP 8 时,我们将被迫检测特定字符并像我所做的那样手动覆盖编码在第 12 行。在后一种情况下,如果已经存在针对此问题的特定错误报告,则需要创建或可能更新错误报告。
所以技术上的问题是:
我们如何正确检测所有字符编码以防止在将字符串转换为 UTF-8 期间丢失任何字符?
如果不存在这样的正确答案,则有效答案包括在其他纯 ASCII 文本中导致 PHP 无法正确检测正确字符编码的字符,从而导致不正确的 UTF-8 编码字符串。假设这个问题在未来得到解决,并且可以针对所有其他相关答案中列出的所有奇怪字符进行验证,然后可以接受一个正确的答案。
最佳答案
您将 PHP 无法解决的问题归咎于 PHP:
您的实际问题是您收到的信息是错误的 - 发送给您的系统犯了一个常见的错误,将 Windows-1252 错误标记为 ISO-8859-1。
这两种编码在 256 个可能的 8 位值中有 224 个的含义一致。他们不同意从 0x80 到 0x9F 的值:这些是 ISO 8859 中的控制字符,并且(大部分)分配给 Windows-1252 中的可打印字符。
请注意,任何系统都无法自动告诉您预期的解释是什么 - 无论哪种方式,内存中都只有一个字节包含(例如)0x96。但是,来自 ISO 8859 的额外控制字符很少使用,因此如果字符串声称是 ISO-8859-1 但包含该范围内的字节,则几乎可以肯定它采用其他编码。由于 Windows-1252 的使用非常广泛(并且经常以这种方式被错误标记),一个常见的解决方案是简单地假设任何标记为 ISO-8859-1 的数据实际上是 Windows-1252。
这使得解决方案非常简单:
// $input is the ASCII string you've received
$input = '=?ISO-8859-1?Q?orkut=20=96=20convite=20enviado=20por=20Lais=20Piccirillo?=';
// Decode the string into its labelled encoding, and string of bytes
$mime_decoded = imap_mime_header_decode($input);
$input_encoding = $mime_decode[0]->charset;
$raw_bytes = $mime_decode[0]->text;
// If it claims to be ISO-8859-1, assume it's lying
if ( $input_encoding === 'ISO-8859-1' ) {
$input_encoding = 'Windows-1252';
}
// Now convert from a known encoding to UTF-8 for the use of your application
$utf8_string = mb_convert_encoding($raw_bytes, 'UTF-8', $input_encoding);
关于php - 导致 PHP 在转换为 UTF-8 之前无法检测到正确的字符编码导致数据丢失的已知问题字符列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70045981/
我对自定义 CSS 或在将图像作为 Logo 上传到页面时使用编码 block 有疑问。我正在为我的网站使用 squarespace,我需要帮助编码我的 Logo 以使其适合每个页面。一个选项是使用自
如 encoding/json 包文档中所述, Marshal traverses the value v recursively. If an encountered value implement
我必须做一些相当于Java中的iconv -f utf8 -t sjisMS $INPUT_FILE的事情。该命令在 Unix 中 我在java中没有找到任何带有sjisMS的编码。 Java中有Sh
从 PHP 5.3 迁移到 PHP 5.6 后,我遇到了编码问题。我的 MySQL 数据库是 latin1,我的 PHP 文件是 windows-1251。现在一切都显示为“ñëåäíèòå àäðå
我有一个 RScript文件(我们称之为 main.r ),它引用了另一个文件,使用以下代码: source("functions.R") 但是,当我运行 RScript 文件时,它提示以下错误:
我无法设法从 WSDL 创建 RPC/编码风格的代码 - 有谁知道哪个框架可以做到这一点? 带有 adb 和 xmlbeans 映射的 Axis2 无法正常工作(无法处理响应中的肥皂编码)直接使用 X
安装了最新版本的Node.Js()和npm包**(1.2.10)**当我运行 Express 命令来生成项目时,它向我抛出以下错误 buffer.js:240 switch (encoding &
JavaScript中有JSON编码/解码base64编码/解码函数吗? 最佳答案 是的,btoa() 和 atob() 在某些浏览器中可以工作: var enc = btoa("this is so
>>> unicode('восстановление информации', 'utf-16') Traceback (most recent call last): File "", line
我当然熟悉 java.net.URLEncoder 和 java.net.URLDecoder 类。但是,我只需要 HTML 样式的编码。 (我不想将 ' ' 替换为 '+' 等)。我不知道任何只做
有一个非常简单的 SSIS 包: OLE DB Source 通过 View 获取数据(数据库表 nvarchar 或 nchar 中的所有字符串列)。 派生列,用于格式化现有日期并将其添加到数据集(
我正在使用一个在 Node 中进行base64编码的软件,如下所示: const enc = new Buffer('test', 'base64') console.log(enc) 显示: 我正
我试图将带有日语字符的数据插入到 oracle 数据库中。事情是保存在数据库中的是一堆倒置的问号。我该如何解决这个问题 最佳答案 见 http://www.errcode.net/blogs/?p=6
当我在 java 中解压 zip 文件时,我发现文件名中出现了带有重音字符的奇怪行为。 西索: Add File user : L'equipe Technique -- Folder : spec
在网上冲浪我找到了 ExtJS 的 Ext.Gantt 插件,该扩展有一个特殊的编码。任何人都知道如何编码那样或其他复杂的形式。 Encoded Gantt Chart 最佳答案 它似乎被 Dean
我正在用C语言做一个编码任务,我进展顺利,直到读取符号并根据表格分配相应的代码的部分。我必须连接几个代码,直到它们的长度达到 32 位,为此我必须将它们写入一个文件中。这种写入文件的方法给我带来了很多
我有一个外部链接的 javascript 文件。在那个 javascript 里面,我有这个功能: function getMonthNumber(monthName){ monthName = mo
使用mechanize,我检索到一个网页的源页面,其中包含一些非ASCII字符,比如汉字。 代码如下: #using python2.6 from mechanize import Browser b
我有一个包含字母 ø 的文件。当我用这段代码 File.ReadLines(filePath) 读取它时,我得到了一个问号而不是它。 当我像这样添加编码时 File.ReadLines(filePat
如何翻译下面的字符串 H.P. Dembinski, B. K\'{e}gl, I.C. Mari\c{s}, M. Roth, D. Veberi\v{c} 进入 H. P. Dembinski,
我是一名优秀的程序员,十分优秀!