天道酬勤,学无止境

How to read Chinese files?

I'm stuck with all this confusing encoding stuff. I have a file containing Chinese subs. I actually believe it is UTF-8 because using this in Notepad++ gives me a very good result. If I set gb2312 the Chinese part is still fine, but I will see some UTF8 code not being converted.

The goal is to loop through the text in the file and count how many times the different chars come up.

import os
import re
import io

character_dict = {}
for dirname, dirnames, filenames in os.walk('.'):
    for filename in filenames:
        if "srt" in filename:
            import codecs
            f = codecs.open(filename, 'r', 'gb2312', errors='ignore')
            s = f.read()

            # deleting {}
            s = re.sub('{[^}]+}', '', s)
            # deleting every line that does not start with a chinese char
            s = re.sub(r'(?m)^[A-Z0-9a-z].*\n?', '', s)
            # delete non chinese chars
            s = re.sub(r'[\s\.A-Za-z0-9\?\!\\/\-\"\,\*]', '', s)
            #print s
            s = s.encode('gb2312')
            print s
            for c in s:
                #print c
                pass

This will actually give me the complete Chinese text. But when I print out the loop on the bottom I just get questionmarks instead of the single chars.

Also note I said it is UTF8, but I have to use gb2312 for encoding and as the setting in my gnome-terminal. If I set it to UTF8 in the code i just get trash no matter if I set my terminal to UTF8 or gb2312. So maybe this file is not UTF8 after all!?

In any case s contains the full Chinese text. Why can't I loop it?

Please help me to understand this. It is very confusing for me and the docs are getting me nowhere. And google just leads me to similar problems that somebody solves, but there is no explanation so far that helped me understand this.

评论

gb2312 is a multi-byte encoding. If you iterate over a bytestring encoded with it, you will be iterating over the bytes, not over the characters you want to be counting (or printing). You probably want to do your iteration on the unicode string before encoding it. If necessary, you can encode the individual codepoints (characters) to their own bytestrings for output:

# don't do s = s.encode('gb2312')
for c in s:      # iterate over the unicode codepoints
    print c.encode('gb2312')  # encode them individually for output, if necessary

You are printing individual bytes. GB2312 is a multi-byte encoding, and each codepoint uses 2 bytes. Printing those bytes individually won't produce valid output, no.

The solution is to not encode from Unicode to bytes when printing. Loop over the Unicode string instead:

# deleting {}
s = re.sub('{[^}]+}', '', s)
# deleting every line that does not start with a chinese char
s = re.sub(r'(?m)^[A-Z0-9a-z].*\n?', '', s)
# delete non chinese chars
s = re.sub(r'[\s\.A-Za-z0-9\?\!\\/\-\"\,\*]', '', s)
#print s

# No `s.encode()`!
for char in s:
    print char

You could encode each char chararter individually:

for char in s:
    print char

But if you have your console / IDE / terminal correctly configured you should be able to print directly without errors, especially since your print s.encode('gb2312)` produces correct output.

You also appear to be confusing UTF-8 (an encoding) with the Unicode standard. UTF-8 can be used to represent Unicode data in bytes. GB2312 is an encoding too, and can be used to represent a (subset of) Unicode text in bytes.

You may want to read up on Python and Unicode:

  • The Python Unicode HOWTO

  • Pragmatic Unicode by Ned Batchelder

  • The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) by Joel Spolsky

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在熊猫数据框中显示汉字?(How to display Chinese characters inside a pandas dataframe?)
    问题 我可以读取一个csv文件,其中有一列包含汉字(其他列是英文和数字)。 但是,中文字符无法正确显示。 看下面的照片 我用pd.read_csv()加载了 csv 文件。 display(data06_16)或data06_16.head()都不能正确显示汉字。 我尝试将以下几行添加到我的.bash_profile : export LC_ALL=zh_CN.UTF-8 export LANG=zh_CN.UTF-8 export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 但它没有帮助。 我也尝试将encoding arg 添加到pd.read_csv() : pd.read_csv('data.csv', encoding='utf_8') pd.read_csv('data.csv', encoding='utf_16') pd.read_csv('data.csv', encoding='utf_32') 这些根本行不通。 如何正确显示汉字? 回答1 我只记得源数据集是使用encoding='GBK'创建encoding='GBK' ,所以我再次尝试使用 data06_16 = pd.read_csv("../data/stocks1542monthly.csv", encoding="GBK") 现在,我可以看到所有的汉字。
  • Java 读取ANSI文件中文乱码问题解决方式[转]
    Java 读取ANSI文件中文乱码问题解决方式[转] 参考文章: (1)Java 读取ANSI文件中文乱码问题解决方式[转] (2)https://www.cnblogs.com/jimcsharp/p/9528088.html 备忘一下。 来源:https://blog.csdn.net/kodmoqn/article/details/115518813
  • java 流 中文_Java IO流之中文乱码
    相信有过学过JavaEE的人们都有遇到过中文乱码问题吧,最简单的就是表单数据提交时中文出现乱码,乱码难解决吗?其实不难,只要掌握好编码的设置,乱码神马的一边去。 今天主要就讲讲一些常用的可以设置编码的函数的用法。讲一下常见的编码,例如ISO-8859-1,gbk,utf-8等,这三个就是最常见的了。首先,为了防止乱码,我们得先统一编码,然后出现乱码再通过一些函数来解决。 下面讲讲常见的中文乱码解决方法和例子吧..既然说了表单数据出现中文乱码,那就顺便说说解决方法吧. 函数:new String(byte[] data, String encoding); 这个方法主要就是用于解决上面说的表单数据提交时出现中文乱码,这个方法通常与String.getBytes(String encoding)一起使用. 用法:String str = new String(formMsg.getBytes("ISO-8859-1"),"utf-8"); 因为今天主要要讲一下IO流操作中易出现的中文乱码解决方法,所以就言归正传,说说我在学习中遇到的乱码问题和解决方法吧. 首先,我们都知道Java的IO流中按字节分就有字节流和字符流之分,看字面意思就知道,字节流是按字节为单位来操作的,而字符流当然是按字符为单位来操作的咯,字节流一般是用来操作一些二进制文件,例如MP3文件,JPG等等。字符流呢
  • 如何在R中读取未知编码的csv数据(How to read csv data with unknown encoding in R)
    问题 我有一个.csv数据,可以从网页上查看它,但是当我将其读入R ,某些数据无法显示。 数据在此处home.ustc.edu.cn/~lanrr/data.csv mydata = read.csv("http://home.ustc.edu.cn/~lanrr/data.csv", header = T) View(mydata) # show something like this: # 9:39:37 665 600160 �޻��ɷ� ���� ���� 8.050 100 805.00 ��ȯ �ɽ� ��ȯ���� E004017669 665 2 9:39:38 697 930 �������� ���� ���� 4.360 283 1233.88 ���� �ɽ� ����Ʒ���� 680001369 697 数据中包含一些中文单词,但是如果我需要更改编码或进行其他操作,我不需要吗,有人遇到过这个问题吗? mydata = read.csv("http://home.ustc.edu.cn/~lanrr/data.csv", encoding = "UTF-8", header = T, stringsAsFactors = F) View(mydata) # 9:39:37 665 600160 <U+00BE><U+07BB><U+00AF><U+00B9
  • How to read PDF files which are in asian languages (Chinese, Japanese, Thai, etc.) and store in a string in python
    I am using PyPDF2 to read PDF files in python. While it works well for languages in English and European languages (with alphabets in english), the library fails to read Asian languages like Japanese and Chinese. I tried encode('utf-8'), decode('utf-8') but nothing seems to work. It just prints a blank string on extraction of the text. I have tried other libraries like textract and PDFMiner but no success yet. When I copy the text from PDF and paste it on a notebook, the characters turn into some random format text (probably in a different encoding). def convert_pdf_to_text(filename): text = '
  • How to display Chinese characters inside a pandas dataframe?
    I can read a csv file in which there is a column containing Chinese characters (other columns are English and numbers). However, Chinese characters don't display correctly. see photo below I loaded the csv file with pd.read_csv(). Either display(data06_16) or data06_16.head() won't display Chinese characters correctly. I tried to add the following lines into my .bash_profile: export LC_ALL=zh_CN.UTF-8 export LANG=zh_CN.UTF-8 export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 but it doesn't help. Also I have tried to add encoding arg to pd.read_csv(): pd.read_csv('data.csv', encoding='utf_8') pd
  • 如何在 r 控制台中显示和输入中文(和其他非 ASCII)字符?(how to display and input chinese (and other non-ASCII) character in r console?)
    问题 我的系统:win7 Ultimate 64 英文版 + r-3.1(64) 。 这是我的 sessionInfo。 > sessionInfo() R version 3.1.0 (2014-04-10) Platform: x86_64-w64-mingw32/x64 (64-bit) locale: [1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 LC_NUMERIC=C LC_TIME=English_United States.1252 attached base packages: [1] stats graphics grDevices utils datasets methods base 1.r控制台无法输入汉字当我在 r 控制台中输入一个汉字时,它变成了乱码。 2.r控制台无法显示汉字当我在 r 控制台中读取数据时,汉字变成了乱码。 您可以下载数据,并使用 read.table("r1.csv",sep=",") 下载数据 如果您不知道如何从我的网站获取数据,请参阅图表以下载数据。 如何设置我的电脑以在 r 控制台中正确显示和输入中文字符? 我已经更新了中文语言包,并启用了它
  • java io流设置编码格式_java问题,被IO流中文乱码搞晕了
    原本我的工具Myeclipse我编码设为UTF-8。我一个txt文件内容读到另一个txt文件,用字节流没中文乱码,字符流出现乱码。接着我有把工具编码设为ISO8859_1,字符流中文乱码没了,但是字节... 原本我的工具Myeclipse我编码设为UTF-8。我一个txt文件内容读到另一个txt文件,用字节流没中文乱码,字符流出现乱码。接着我有把工具编码设为ISO8859_1,字符流中文乱码没了,但是字节流也没中文乱码(我特意把字节数组长度设为1),这我就感觉不对劲了,不是说字节流应该出现中文乱码吗。还有就是工具编码改为UTF-8,字符流就会出现中文乱码这个问题是为何。另外txt文件中的内容我在控制台打印的内容也是乱码。 字节流部分代码 File file=new File("E:/2.txt");FileInputStream fis=new FileInputStream(file);File file2=new File("E:/4444.txt"); fos2=new FileOutputStream(file2); if (file2.isFile()) {file2.createNewFile();} byte[] b=new byte[(int)file.length()]; byte[] b2=new byte[1]; String s; while((fis
  • 如何在INI文件中读取/写入中文/日语字符?(How to read/write Chinese/Japanese characters from/to INI files?)
    问题 使用WritePrivateProfileString和GetPrivateProfileString导致??? 而不是真实角色。 回答1 GetPrivateProfileString()和WritePrivateProfileString()可以与Unicode一起使用。 如果ini文件是UTF-16LE编码的,即它具有UTF-16 BOM,则这些功能将以Unicode工作。 但是,如果函数必须创建文件,则它们将创建一个ANSI文件,并且只能在ANSI中工作。 因此,要将函数与Unicode一起使用,请在首次使用它之前创建您的ini文件,并在其中写入UTF-16LE字节顺序标记。 然后照常进行。 请注意,这些功能对于UTF-8完全不起作用。 有关您想要了解的更多信息,请参阅Michael Kaplan的博客。 回答2 WritePrivateProfileStringW函数将以旧版系统编码(例如,日语系统上的Shift-JIS)写入INI文件,因为它是旧版支持功能。 如果要具有完全启用Unicode的INI文件,则需要使用外部库。 试试SimpleIni http://code.jellycan.com/simpleini/ 它是C ++,单个头文件,带有MIT许可证的模板库(即可以商业使用)。 将其包括到您的源文件中并使用它。 它是跨平台的,支持UTF-8和旧编码文件
  • Reading Chinese character from .csv file in C/C++
    I have a .csv file with chinese characters. I need to read in these chinese characters and store them for further use in the program. I know that chinese characters have to be processed in utf format, using wchar_t and the like, but I am not able to figure out exactly how this is to be done. Can anyone please help me out?
  • 如何在R中读取utf-8格式的数据?(how to read data in utf-8 format in R?)
    问题 我的系统:win7 + R-3.0.2。 > Sys.getlocale() [1] "LC_COLLATE=Chinese (Simplified)_People's Republic of China.936;LC_CTYPE=Chinese (Simplified)_People's Republic of China.936;LC_MONETARY=Chinese (Simplified)_People's republic of China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_People's Republic of China.936" 在Microsoft记事本中保存了两个内容相同的文件:一个保存为ansi格式,另一个保存为utf8格式。数据是马来西亚航空M370中的死亡名称。 或者,您可以通过这种方式创建文件。 1)将数据复制到Microsoft记事本中。 乘客姓名,性别,出生日期 HuangTianhui,男,1948/05/28 姜翠云,女,1952/03/27 李红晶,女,1994/12/09 2)将其保存为test.ansi,并在记事本中使用ansi格式。 3)在记事本中将其另存为test.utf8,格式为utf-8。 read.table("test.ansi",sep=",",header
  • Why is Java BufferedReader() not reading Arabic and Chinese characters correctly?
    I'm trying to read a file which contain English & Arabic characters on each line and another file which contains English & Chinese characters on each line. However the characters of the Arabic and Chinese fail to show correctly - they just appear as question marks. Any idea how I can solve this problem? Here is the code I use for reading: try { String sCurrentLine; BufferedReader br = new BufferedReader(new FileReader(directionOfTargetFile)); int counter = 0; while ((sCurrentLine = br.readLine()) != null) { String lineFixedHolder = converter.fixParsedParagraph(sCurrentLine); System.out.println
  • 为什么Java BufferedReader()无法正确读取阿拉伯和中文字符?(Why is Java BufferedReader() not reading Arabic and Chinese characters correctly?)
    问题 我正在尝试读取每行包含英语和阿拉伯字符的文件,以及每行包含英语和汉语字符的另一个文件。 但是,阿拉伯语和中文字符无法正确显示-它们只是显示为问号。 知道如何解决这个问题吗? 这是我用来阅读的代码: try { String sCurrentLine; BufferedReader br = new BufferedReader(new FileReader(directionOfTargetFile)); int counter = 0; while ((sCurrentLine = br.readLine()) != null) { String lineFixedHolder = converter.fixParsedParagraph(sCurrentLine); System.out.println("The line number "+ counter + " contain : " + sCurrentLine); counter++; } } 版本01 阅读该行并获取阿拉伯语和中文单词后,我使用一个函数来翻译它们,只需在ArrayList中搜索给定的阿拉伯文字(包含所有预期的单词)(使用indexOf();方法)。 然后,当找到单词的索引时,它会被用来调用另一个Arraylist中具有相同索引的英语单词。 但是,此搜索始终返回false
  • java中写入txt文件中文乱码_IO流读写文件中文乱码的解决
    问题描述 在使用 Java 读写文件的过程中,当涉及到中文字符,会出现乱码的问题,读取内容与预期结果不符。 问题分析 所有的文件都是有编码格式的,其中 txt 和 Java 文件一般有三种编码格式:ISO8859-1、GSK 和 UTF-8. 其中 ISO8859-1 是西欧编码,不适用中文汉字;GSK 和 UTF-8 适用于中文。Windows 10下默认的编码格式是 UTF-8. 基于此,使用不同的编码格式读写文件,就会产生乱码。例如,eclipse 下默认的编码格式为 GBK,直接使用字符流读取会产生如下乱码。 代码部分 /** * 缓冲字符流读文件 * @param inPath * @return * @throws Exception */ public static String testBufferedReader(String inPath) throws Exception { BufferedReader bi = new BufferedReader(new FileReader(inPath)); StringBuffer sbr = new StringBuffer(); String s = null; while((s = bi.readLine()) != null) { sbr.append(s); } s = sbr.toString()
  • How to read/write Chinese/Japanese characters from/to INI files?
    Using WritePrivateProfileString and GetPrivateProfileString results in ??? instead of the real characters.
  • 数据分析之Pandas从入门到放弃:代码+实战,9分钟带你推开Pandas大门!!!
    今天整理了一下Pandas的使用方法; 应该是全网整理最完整,最简洁易读(立整)的一篇文章!! 嗯…别不信,确实是这样的~ ~ 跟着小鱼, 带你9分钟推开Pandas的大门!! 从此走上数据分析师的苦逼之路!! Pandas使用方法 1. Pandas的基本定义2. Pandas的使用方法2.1 Series2.2 DataFrame使用2.2.1 删除操作2.2.2 去重操作2.2.3 更改数据格式操作2.2.4 去掉数据间的空格操作2.2.5 大小写转换操作2.2.6 数据清洗 2.3 Pandas中的统计函数2.3.1 基本数据统计用法2.3.2 函数链接用法2.3.3 loc函数及iloc函数的用法 2.4 数据分组2.5 数据排序2.6读写文件2.7 合并两个Dataframe 3. Pandas实战代码及参考文献 1. Pandas的基本定义 ・在数据分析中,Pandas的使用频率很高 ・Pandas可以说是基于NumPy构建的含有更高级数据结构和分析能力的工具包 ・Series和DataFrame是两个核心数据结构,分别代表一维的序列和二维的表结构 ・基于这两种数据结构,Pandas可以对数据进行导入、清洗、处理、统计和输出 2. Pandas的使用方法 2.1 Series ・Series是个定长的字典序列 ・在存储的时候,相当于两个ndarry
  • OpenCV无法读取中文路径,也无法显示中文在图像中问题
    一、无法显示中文路径问题方法1:def cv_imread(file_path): cv_img = cv2.imdecode(np.fromfile(file_path,dtype=np.uint8),-1) return cv_img方法2:import osdef cv_imread(file_path): root_dir, file_name = os.path.split(file_path) pwd = os.getcwd() if root_dir: os.chdir(root_dir) cv_img = cv2.imread(file_name) os.chdir(pwd) return cv_img方法3:opencv不接收non-ascii的路径,只需要将unicode字符串编码为gbk字节数组,然后把gbk字节数组直接变为字符串,这个字符串就是ascii的路径了。import cv2def cv_imread(file_path = ""): file_path_gbk = file_path.encode('gbk') # unicode转gbk,字符串变为字节数组 img_mat = cv2.imread(file_path_gbk.decode()) # 字节数组直接转字符串,不解码 return img_mat二、无法显示中文在图像中问题
  • 如何在Java中使用中文和日语字符作为字符串?(how to use chinese and japanese character as string in java?)
    问题 你好我正在使用Java语言。 在此,我必须使用一些中文,日文字符作为字符串,并使用System.out.println()进行打印。 我怎样才能做到这一点? 谢谢 回答1 Java字符串支持Unicode,因此中文和日语是没有问题的。 不过,可能需要告知其他工具(例如文本编辑器)和您的OS Shell。 读取或打印Unicode数据时,必须确保控制台或流也支持Unicode(否则它可能会被问号替换)。 Writer unicodeFileWriter = new OutputStreamWriter( new FileOutputStream("a.txt"), "UTF-8"); unicodeFileWriter.write("漢字"); 您可以直接将Unicode文字嵌入Java源代码文件中,但是您需要告诉编译器该文件位于UTF-8中( javac -encoding UTF-8 )。 String x = "漢字"; 如果想发狂,甚至可以在方法,变量或类名中使用中文字符。 但这违背了命名约定,我强烈建议至少不要在类名中使用它(因为它们需要映射到文件名,而Unicode可能会在其中引起问题): 結果 漢字 = new 物().処理(); 回答2 只需使用它,Java字符串就完全是unicode,因此应该没有什么难说的 System.out.println("世界您好!"
  • python3 读文件 编码_Pyhton3下的ISO8859-1编码文件的读取
    在学习tkinter库时,自己码了一个简单的文件搜索GUI。具体功能是输入关键字、文件类型和所要搜索的文件夹路径,按下搜索按钮能将相关的文件的绝对路径添加到列表上,双击列表所选项能够打开一个包含文件内容的可编辑窗口。 文件搜索GUI 在测试GUI时,发现某些文本文件无法读取,出现报错。具体为: 当执行到如下语句时f = open('/Users/gy/Desktop/自动化1404荣誉称号.txt','r') #以可读模式打开文件 str1 = f.read() #读取文件内容 出现报错: 出现编码错误 意思就是使用utf-8编码方式读取不了文件里的内容。 这时候,需要查看一下自动化1404荣誉称号.txt文件使用采用何种编码方式存储。 ISO 8859-1 原来自动化1404荣誉称号.txt文件是采用ISO 8859-1编码方式存储的。 ISO 8859-1属于单字节编码,是没有中文对应的编码,但可以用ISO 8859-1编码来"表示"中文。那么问题来了,为什么这个文件的内容几乎都是中文,但能用ISO 8859-1编码方式来存储呢? 然而GBK编码和utf-8编码都支持中文编码。那么按我的理解,如果一个文件包含中文,这个文件应该是刚刚讲到的两种编码方式之一,而不应该是ISO 8859-1。一般来说,采用GBK方式编码一个中文字用两个字节来表示
  • how to read data in utf-8 format in R?
    My system:win7+R-3.0.2. > Sys.getlocale() [1] "LC_COLLATE=Chinese (Simplified)_People's Republic of China.936;LC_CTYPE=Chinese (Simplified)_People's Republic of China.936;LC_MONETARY=Chinese (Simplified)_People's republic of China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_People's Republic of China.936" There are two files with same content saved in microsoft notepad: one is saved as ansi format, the other is saved as utf8 format.The data is death name in M370 Malaysia Airlines . Or you can create the file this way. 1)copy the data into microsoft notepad. 乘客姓名,性别,出生日期 HuangTianhui,男,1948