转换为八进制转义UTF-8

你好,
我将Unicode的stings写成一个特殊的文本文件,需要
具有非ASCII字符为八八块UTF-8代码.
例如,字母""字母(拉丁资本I急性,代码点205)
将以" \ 303 \ 215"的形式出现.
稍后我还必须从文件中读回并转换
将字符逃回了一个Unicode字符串.
有人对如何从""到" \ 303 \ 215"有任何建议
反之亦然?
我知道我可以通过执行代码点
但是似乎没有任何类似的方法来获得八分之一
逃脱版本.
谢谢,
迈克尔

# 回答1


迈克尔·戈兹(Michael Goerz)写道:
但是似乎没有任何类似的方法来获得八分之一
逃脱版本.
谢谢,
迈克尔
我想出了以下解决方案.不是很漂亮,但是
作品(我希望没有错误).谁能想到一种更好的方法?
迈克尔
_________
进口Binascii
def逃生:
hexstring = binascii.b2a_hex(s)
结果=""
而Len(六角形)0:
(hexbyte,hexstring)=(hexstring [:2],hexstring [2:])
octbyte = oct(int(hexbyte,16)).Zfill(3)
结果 + =" \\" + octbyte [-3:]
返回结果
def unescape(s):
结果=""
而Len(S)0:
如果s [0] ==" \\":
(Octbyte,s)=(S [1:4],S [4:])
尝试:
结果 += chr(int(octbyte,8))
除valueerror:
结果 +=" \\"
s = octbyte + s
别的:
结果 += s [0]
S = S [1:]
返回结果
打印逃生(" \ 303 \ 215")
打印unescape('adf \\ 303 \\ 215adf')
# 回答2


在12月2日,晚上8:38,迈克尔·戈兹(Michael Goerz)<答案...@8439.e4ward.comwrote:
但是似乎没有任何类似的方法来获得八分之一
逃脱版本.

我想出了以下解决方案.不是很漂亮,但是
作品(我希望没有错误).谁能想到一种更好的方法?
迈克尔
_________
进口Binascii
def逃生:
hexstring = binascii.b2a_hex(s)
结果=""
而Len(六角形)0:
(hexbyte,hexstring)=(hexstring [:2],hexstring [2:])
octbyte = oct(int(hexbyte,16)).Zfill(3)
结果 + =" \\" + octbyte [-3:]
返回结果
def unescape(s):
结果=""
而Len(S)0:
如果s [0] ==" \\":
(Octbyte,s)=(S [1:4],S [4:])
尝试:
结果 += chr(int(octbyte,8))
除valueerror:
结果 +=" \\"
s = octbyte + s
别的:
结果 += s [0]
S = S [1:]
返回结果
打印逃生(" \ 303 \ 215")
打印unescape('adf \\ 303 \\ 215adf')
看起来Escape()可以更简单...
def逃生:
结果= []
对于s中的char:
result.append(" \%o"%ORD(char))
返回''.join(结果)
问候,
乔丹

# 回答3


Monkeesage写道:
井井有条!非常感谢...
迈克尔
# 回答4


迈克尔·戈兹(Michael Goerz)写道:
也许与:
...返回"" .join(" \%o"%ord(c)for source.encode('utf8'))
...
... bytes ="".
... return bytes.decode('utf8')
... '\\ 303 \\ 215'
-
Hth
迈克尔
# 回答5


在12月2日,晚上11:46,迈克尔·斯宾塞(Michael Spencer) 也许与:
...返回"" .join(" \%o"%ord(c)for source.encode('utf8'))
...
... bytes ="".
... return bytes.decode('utf8')
...
'\\ 303 \\ 215'

Hth
迈克尔
好东西. :)如果我可能建议略有差异来处理案例
其中"编码"字符串包含纯文本和八元
逃脱...
DEF解码(编码):
对于octc in(c for c in re.findall(r'\\(\ d {3})',编码)):):
编码=编码.replace(r'\%s'%octc,chr(int(octc,8)))
返回编码.decode('utf8')
这样,它可以处理" \\ 141 \\ 144 \\ 146 \\ 303 \\ 215 \\ 141 \\ 144 \\ 146"
以及" ADF \\ 303 \\ 215ADF".
问候,
乔丹
# 回答6


在12月3日,1:31 AM,Monkeesage ...返回"" .join(" \%o"%ord(c)for source.encode('utf8'))
...
... bytes ="".
... return bytes.decode('utf8')
...
'\\ 303 \\ 215'

好东西. :)如果我可能建议略有差异来处理案例
其中"编码"字符串包含纯文本和八元
逃脱...
DEF解码(编码):
对于octc in(c for c in re.findall(r'\\(\ d {3})',编码)):):
编码=编码.replace(r'\%s'%octc,chr(int(octc,8)))
返回编码.decode('utf8')
这样,它可以处理" \\ 141 \\ 144 \\ 146 \\ 303 \\ 215 \\ 141 \\ 144 \\ 146"
以及" ADF \\ 303 \\ 215ADF".
问候,
约旦
呃...
DEF解码(编码):
对于rec.findall(r'\\(\ d {3})'的octc,编码):
编码=编码.replace(r'\%s'%octc,chr(int(octc,8)))
返回编码.decode('utf8')

# 回答7


Monkeesage写道:
好东西. :)如果我可能建议使用一些略有变化来处理"编码"字符串包含纯文本的情况以及八十片尺寸... def解码(编码):for Octc in(c for c for c in re.findall(r'\\)(r'\\( \ d {3})',编码)):编码=编码.replace(r'\%s'%octc,chr(int(octc,8)))return encoded.decode('utf8')以这种方式可以处理两个" \\ 141 \\ 144 \\ 146 \\ 303 \\ 215 \\ 141 \\ 144 \\ 146"以及" adf \\ 303 \\ 303 \\ 215adf".

呃...
DEF解码(编码):
对于rec.findall(r'\\(\ d {3})'的octc,编码):
编码=编码.replace(r'\%s'%octc,chr(int(octc,8)))
返回编码.decode('utf8')
你们俩的好建议!我想出了我的"最终"解决方案
基于他们.它仅编码非ASCII和非印刷品,并留下
在输入和输出的Unicode字符串中.另外,现在低ASCII值
还编码为3位八位序列,以便解码可以捕获它们
适当地.
非常感谢,
迈克尔
____________
导入
DEF ENCODE(源):
编码=""
来源中的角色:
if(ord(字符)<32)或(ord(字符)128):
for targun.encode('utf8')中的字节:
编码 +=(" \%03O"%ord(字节))
别的:
编码 +=字符
retrur n编码.decode('utf-8')
DEF解码(编码):
解码=编码.encode('utf-8')
对于rec.findall(r'\\(\ d {3})'的octc,解码):
解码=解码.replace(r'\%s'%octc,chr(int(octc,8)))
返回解码.decode('utf8')
orig = u"blaíblub" + chr(10)
enc = encode(orig)
DEC = DECODE(ENC)
打印原始
打印ENC
打印DEC

# 回答8


>>>> Michael Goerz 如果您编码字符<32,似乎更合适地编码127.
此外,您的代码在字符串的大小上是二次的,因此,如果您使用
长字符串最好使用加入.
- -
Piet Van Oostrum
URL:http://www.cs.uu.nl/~piet [PGP 8DAE142BE17999C4]
私人电子邮件:pige@vanoostrum.org
# 回答9


在12月3日上午8:10,迈克尔·戈兹(Michael Goerz)<答案...@8439.e4ward.comwrote:
你们俩的好建议!我想出了我的"最终"解决方案
基于他们.它仅编码非ASCII和非印刷品,并留下
在输入和输出的Unicode字符串中.另外,现在低ASCII值
还编码为3位八位序列,以便解码可以捕获它们
适当地.
非常感谢,
迈克尔
____________
导入
DEF ENCODE(源):
编码=""
来源中的角色:
if(ord(字符)<32)或(ord(字符)128):
for targun.encode('utf8')中的字节:
编码 +=(" \%03O"%ord(字节))
别的:
编码 +=字符
返回编码.decode('utf-8')
DEF解码(编码):
解码=编码.encode('utf-8')
对于rec.findall(r'\\(\ d {3})'的octc,解码):
解码=解码.replace(r'\%s'%octc,chr(int(octc,8)))
返回解码.decode('utf8')
orig = u"blaíblub" + chr(10)
enc = encode(orig)
DEC = DECODE(ENC)
打印原始
打印ENC
打印十二月
优化...在decode()存储中匹配键,以便您
仅对每个唯一字符进行一次替换...
DEF解码(编码):
解码=编码.encode('utf-8')
匹配= {}
对于rec.findall(r'\\(\ d {3})'的octc,解码):
匹配[OCTC] =无
对于比赛中的OCTC:
解码=解码.replace(r'\%s'%octc,chr(int(octc,8)))
返回解码.decode('utf8')
未经测试...
问候,
乔丹

标签: python

添加新评论