4

我了解到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));

那个时候上面选择的字符丢失了。

在此处输入图像描述

4

1 回答 1

5

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

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

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

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

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

于 2013-10-17T11:05:50.300 回答