如何解码包含 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 还解释了如何在波斯语控制台中编写。如果您还没有进行这些设置,则必须先进行这些设置。
在网络抓取中,有时我需要从波斯语网页中获取数据,所以当我尝试对其进行解码并查看提取的数据时,结果并不是我所期望的。
这是发生此问题时的分步代码:
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 还解释了如何在波斯语控制台中编写。如果您还没有进行这些设置,则必须先进行这些设置。