如何解码包含 Persian/Arabic 个字符的字符串?

how to decode a string containing Persian/Arabic characters?

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

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

1.getting数据来自波斯语网站

import urllib2

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

2.detecting 编码类型

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')

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

你应该解码成其他东西而不是编码成 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']))

根本问题是character-set检测不是一个完全确定性的问题。 chardet 和每个类似的程序都是 heuristic 检测器。不能保证或期望它会一直猜对,您的程序需要处理这个问题。

如果您的问题是单个网站,只需检查它并 hard-code 正确的字符集。

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

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

许多网站都在撒谎,他们给你 well-defined 和有用的 Content-Type: header 和 lang 标签......这完全背叛了实际存在的东西 - 有时是因为管理错误,有时是因为他们使用的 CMS 迫使他们假装他们的网站使用的是一种语言,而实际上并非如此;通常是因为后端没有语言支持,并且 "helpfully" 会添加一个标签或 header 事实上,说你不知道会更正确并且更有帮助当你不知道的时候。

你能做的就是防御性地编码。也许尝试 chardet,然后回退到站点告诉您的任何内容,然后回退到 UTF-8,然后可能是 Latin-1?陪审团出局,而世界不断变化...

我遇到了这个问题,我认为以上任何答案都不奏效

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

//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 这个 link 还解释了如何在波斯语控制台中编写。如果您还没有进行这些设置,则必须先进行这些设置。