版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
utf-8可以根据字的第一个字节移位推出长度的
0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
打开二进制文件用open('filename', 'rb')
解码用s_unicode = s.decode('UTF-8')
谢谢楼上的回答。
首先读取一个4字节的整形,然后再读取一个长度为18的utf-8字符串;这个长度为18的utf-8字符串的字节长度是不定的。
所以您的方案似乎不行,或者我没有完全理解您的方案
######谢谢楼上的回答。
首先读取一个4字节的整形,然后再读取一个长度为18的utf-8字符串;这个长度为18的utf-8字符串的字节长度是不定的。
所以您的方案似乎不行,或者我没有完全理解您的方案
谢谢楼上的,根据你的提示,我搞定了,同时参考了这儿 http://zh.wikipedia.org/zh-cn/UTF-8
下面是正确答案,给后来人用吧
# -*- coding: utf-8 -*-
def how_many_byte(a):
"""
判断这个字符是由几个字节组成的
向右移2位,如果移位后的数字的各位都是1那么这个字符由6个字节组成
向右移3位,如果移位后的数字的各位都是1那么这个字符由5个字节组成
以此类推
"""
bits = 8
move_bits = 2
while move_bits < bits:
temp = (a >> move_bits)
all_1 = 0
for i in range(bits-move_bits):
all_1 += 2**i
if temp == all_1: return bits - move_bits
move_bits += 1
return 1
with open('t.txt','rb') as file_t:
#读取3个字节跳过BOM
file_t.read(3)
while True:
#读取一个字节
a = file_t.read(1)
if not a:
print 'read to end of the file'
break
else:
bytes_count = how_many_byte(ord(a))
print bytes_count
if bytes_count > 1:
aleft = file_t.read(bytes_count-1)
a = a+aleft
print '%s length is %i'%(a,len(a))
######
谢谢楼上的回答。
首先读取一个4字节的整形,然后再读取一个长度为18的utf-8字符串;这个长度为18的utf-8字符串的字节长度是不定的。
所以您的方案似乎不行,或者我没有完全理解您的方案
关键是记录一条一条的不知道到哪儿结束,关键的问题是不知道下一个utf-8字符应该是几个字节的,搞定这个,问题也就解决了。
谢谢您的热心帮助。
在python的google group邮件组中发现了更好的办法,请看下面代码:
# -*- coding: cp936 -*-
import mmap
import struct
import StringIO
import codecs
decoder = codecs.getdecoder("utf-8")
print dir(decoder)
def read_int(stream):
result = struct.unpack("l", stream.read(4))
#print type(result)
return result[0]
def read_chars(reader,count):
s = reader.read(chars=count, size=1)
return s
def read_stocks_from_file():
datafile = r'D:\app\HKTest\HKServer\Data\stock.dat'
with codecs.open(datafile, "r", "utf8", "ignore") as f:
stream = f.stream
count = read_int(stream)
print '%i stocks' % count
pos = f.tell()
for index in xrange(count):
market = read_int(stream)
quote_type = read_int(stream)
code = read_chars(f.reader,6)
stockname = read_chars(f.reader,16)
pinyin = read_chars(f.reader,8)
lotsize = read_int(stream)
underlying = read_int(stream)
exdate = read_int(stream)
stock = 'market:%s,type:%s,code:%s,stockname:%s,pinyin:%s,lotsize:%s' % (market,quote_type,code,stockname,pinyin,lotsize)
#if index % 100 == 0 :
print stock
#file_to_write.write(stock)
#if index > 10 :break