如何解码包含波斯语/阿拉伯字符的字符串?

时间:2016-09-24 10:37:57

标签: python python-2.7 decode python-unicode

在网页抓取中,我有时需要从波斯语网页获取数据,因此当我尝试解码并查看提取的数据时,结果不是我期望的结果。

以下是发生此问题时的分步代码:

1.从波斯网站获取数据

import urllib2

data = urllib2.urlopen('http://cafebazar.ir').read() # this is a persian website

2.检测编码类型

import chardet
chardet.detect(data)
# in this case result is : 
{'confidence': 0.6567038227597763, 'encoding': 'ISO-8859-2'}

第3。解码和编码

final = data.decode(chardet.detect(data)['encoding']).encode('ascii', 'ignore')

但最后的结果根本不是波斯语!

3 个答案:

答案 0 :(得分:1)

基本问题是字符集检测不是一个完全确定的问题。 chardet以及类似的每个程序都是启发式检测器。没有任何保证或期望它会一直正确猜测,你的程序需要应对。

如果您的问题是单个网站,只需检查并硬编码正确的字符集即可。

如果您正在处理受限制的一组站点,并且使用受限且有些可预测的语言集,则大多数启发式检测器都会进行调整和设置,您可以通过限制可能性来提高准确性。

在最常见的情况下,没有一种解决方案适用于世界上所有网站。

许多网站都撒谎,它们为您提供定义明确且有用的Content-Type:标题和lang标记...这完全背叛了实际存在的内容 - 有时因为管理员错误,有时因为他们使用CMS这迫使他们假装他们的网站是单一语言,而实际上并非如此;并且通常是因为后端没有语言支持,并且“帮助”的方式添加标签或标题实际上它会更正确,并且实际上有助于说你不知道什么时候你不知道

你可以做的是防御性编码。也许尝试chardet,然后回到网站告诉你的任何东西,然后回到UTF-8,那么也许拉丁-1?当世界不断变化时,陪审团已经出局......

答案 1 :(得分:0)

您应该将其解码为其他内容,而不是编码为ascii,例如utf-8

final = data.decode(chardet.detect(data)['encoding']).encode('utf-8')

为了查看它,您应该将其写入文件,因为大多数终端都没有正确显示非ascii字符:

with open("temp_file.txt", "w", encoding="utf-8") as myfile:
    myfile.write(data.decode(chardet.detect(data)['encoding']))

答案 2 :(得分:0)

我遇到了这个问题,我认为上述任何答案都无法正常工作

所以我自己去寻找答案,这段代码帮助了我

//In this section we enter the data
message="سلام دو.ستان من یک فارسی زبان هستم";
byte[] unicodeBytes = Encoding.UTF8.GetBytes(message);



Encoding ascii = Encoding.ASCII;
Encoding unicode = Encoding.Unicode;
//convert normall bytes to ascci
byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes );
//create new ascii chareacters
char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
//convert accii char to string
ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
string asciiString = Encoding.UTF8.GetString(plainText);

这段代码对我有帮助,希望对您也有用

在底部创建了一个完整的项目 在此示例中,我们首先将字符串转换为二进制 然后我们从二进制状态重建相同的字符串

using System;

using System.Net;
using System.Security.Cryptography;
using System.Text;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {

                   string unicodeString = "سلام این یک تست می باشد ";
                   Encoding ascii = Encoding.ASCII;
                   Encoding unicode = Encoding.Unicode;
                   byte[] unicodeBytes = 
                   Encoding.UTF8.GetBytes(unicodeString);

                    byte[] asciiBytes = Encoding.Convert(unicode, ascii, 
                    unicodeBytes);
                     char[] asciiChars = new 
                    char[ascii.GetCharCount(asciiBytes, 0, 
                    asciiBytes.Length)];
                    ascii.GetChars(asciiBytes, 0, asciiBytes.Length, 
                   asciiChars, 0);
                   string asciiString = 
                 Encoding.UTF8.GetString(unicodeBytes);

      
         }
    }
}

Displaying Arabic characters in C# console application 此链接还说明了如何在波斯语控制台中编写。如果尚未进行这些设置,则必须首先进行这些设置。