【问题标题】:Two byte character in a single byte character encoded (ISO-8859-1) HTML document单字节字符编码 (ISO-8859-1) HTML 文档中的两个字节字符
【发布时间】:2013-10-25 15:19:09
【问题描述】:

我了解到 ISO-8859-1 是单字节字符集。

参见页面http://www.manoramaonline.com/cgi-bin/MMOnline.dll/portal/ep/malayalamContentView.do?tabId=11&programId=1073753760&BV_ID=@@@&contentId=15238737&contentType=EDITORIAL&articleType=Malayalam%20News。它使用马拉雅拉姆语。

HTTP 标头和元标记表明它使用 ISO-8859-1 作为字符编码。

但在此页面中使用了一个两字节字符 (0x201A) (http://unicodelookup.com/#%E2%80%9A)。

(复制字符并在http://unicodelookup.com中查找)

<div id="articleTitleMal" style="padding-top:10px;">
    <font face= "Manorama" >
         ¼ÈØOVA¢: ÜÍß‚Äí 1.28 ...
    </font>
 </div>

如何在单字节编码中使用两个字节字符?

我并不好奇知道这一点。由于不了解上述问题,我的一项任务被卡住了。

更新:他们正在使用字体 www.manoramaonline.com/portal/mmcss/Manorama.ttf,我认为 Manaorama-font 中的某些字符使用了两个字节。

UPDATE2:我尝试使用以下代码将文档从 ISO-8859-1 转换为 UTF-8。

<?php
$t = file_get_contents('http://www.manoramaonline.com/cgi-bin/MMOnline.dll/portal/ep/malayalamContentView.do?tabId=11&programId=1073753760&BV_ID=@@@&contentId=15238737&contentType=EDITORIAL&articleType=Malayalam%20News');

// Change the charset info in meta-tag
$t  = str_replace('ISO-8859-1', 'UTF-8', $t);

file_put_contents('t.html', utf8_encode($t));

那个时候上面选中的字符不见了。

【问题讨论】:

  • 在这种情况下,我会研究使用此处指定的特定字体 http://www.manoramaonline.com/portal/mmcss/mmFont.css ... 此处字体:www.manoramaonline.com/portal/mmcss/Manorama.ttf
  • @jtheman 我看了字体。他们对某些字母使用两字节字符。
  • 当您访问该页面时,您确定编码仍在ISO-8859-1 上吗?因为大多数情况下它会将它们打印为? 标记。
  • @MahanGM 访问页面并检查 HTTP 标头和 Meta 标签。两者都告诉它是 ISO-8859-1
  • 您仍然可以对字符 ‚ 进行 HTML 编码

标签: php html character-encoding truetype


【解决方案1】:

即使页面在 HTTP 标头中声明为 ISO-8859-1 编码,浏览器仍将其解释为 Windows-1252 编码。这是一个由来已久的传统,现在正被正式化。在WHATWG Encoding Standard。

因此,当数据包含字节 82(十六进制)时,它不会被视为控制字符(根据 ISO 8859-1),而是作为 U+201A “‚”(根据 Windows-1252)。

但是,该页面使用字体技巧,根据特殊的内部非标准编码将代码位置映射到马拉雅拉姆语字符。 (如果您禁用页面上的样式表,您可以看到这一点。所有文本都变得乱码。)该页面实际上并不是包含 U+201A “‚”,而是在字体中分配了马拉雅拉姆语字符的字节 82。

因此,您需要按原样保留字节以获得相同的结果。转换为 UTF-8 会破坏这一点。

如果您想将数据转换为 Unicode,您需要找出正在使用的字体的内部编码并在字符级别执行该映射。

【讨论】:

  • 太棒了!你对这个问题给出了更多的说明。让我详细了解一下我的问题的解决方案。
  • 基托斯!重点是该文档不在 ISO-8859-1 中,而是在 windows-1252 中。早些时候,我将它从 ISO-8859-1 转换为 windows-1252。我浪费了几个小时来解决这个问题。现在解决了这个问题。我已经准备好将 Manorama-font-code 转换为 Unicode-code 的代码。那工作正常。问题是我得到的字符是 0x82,但是我的映射函数需要 U+201A。我试图从 ISO-8859-1 而不是 windows-1252 转换数据。
猜你喜欢
  • 1970-01-01
  • 2016-11-26
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多