2017年3月21日 星期二

[python]Ascii ETX STX


處理字串偶然間遇到特殊字元ETX,STX,查了才知道原來是控制碼,一般控制碼是 ASCII 前 32 碼。在python官網有詳細的解釋。

程式:

# -*- coding: utf-8 -*-
#測試EXT STX
stx = '\x02'
etx = '\x03'

s='疵除外 )。",'

ustx=stx.encode('UTF-8')
uetx=etx.encode('UTF-8')

print s.find(etx)
print s.find(uetx)
print s.find(stx)
print s.find(ustx)

輸出:
9
9
-1
-1

NameMeaning
NUL
SOHStart of heading, console interrupt
STXStart of text
ETXEnd of text
EOTEnd of transmission
ENQEnquiry, goes with ACK flow control
ACKAcknowledgement
BELBell
BSBackspace
TABTab
HTAlias for TAB: “Horizontal tab”
LFLine feed
NLAlias for LF: “New line”
VTVertical tab
FFForm feed
CRCarriage return
SOShift-out, begin alternate character set
SIShift-in, resume default character set
DLEData-link escape
DC1XON, for flow control
DC2Device control 2, block-mode flow control
DC3XOFF, for flow control
DC4Device control 4
NAKNegative acknowledgement
SYNSynchronous idle
ETBEnd transmission block
CANCancel
EMEnd of medium
SUBSubstitute
ESCEscape
FSFile separator
GSGroup separator
RSRecord separator, block-mode terminator
USUnit separator
SPSpace
DELDelete


參考:
https://docs.python.org/2/library/curses.ascii.html

2017年3月20日 星期一

[python] ValueError: Invalid control character at: line 1 column 1264 (char 1263)

在處理 string 轉JSON,通常會使用json.loads,但突然遇到這個錯誤。

出現這個錯誤:

ValueError: Invalid control character at: line 1 column 1264 (char 1263)


程式碼:
st={"description": "質底墊\t\n尺寸"}
a=json.loads(st)


這個錯誤是因為 loads這function ,遇到  \t \n 這類跳脫字元,你可以直接使用:

print st[1264 ]

來看看到底是什麼字元出問題。
解決方法就是在json.loads 之前先將這類特殊字元使用replace替換掉就可以解決了。




2017年3月13日 星期一

[python]unicode 轉成中文


新手使用ptyhon2.0一定會遇到中文編碼問題,提供一些直接的教學。


unicode字串 轉中文 用decode function:

a='\u73cd\u59ae\u4f5b'
print a.decode('unicode_escape')

//珍妮佛


unicode字串 轉中文 直接定義字串:

c=u'\u73cd\u59ae\u4f5b'
print c

//珍妮佛


文字字串 轉中文:

b='\xe4\xb8\xad\xe6\x96\x87'
print b

//中文

網路抓下來JSON  unicode字串 轉 中文:

d ='{"name": "\u73cd\u59ae\u4f5b\'s Store"}'
print d.decode('unicode_escape')

//{"name": "珍妮佛's Store"}






  • 「unicode 物件」透過 encode(encoding) 變成「str 物件」
  • 「str 物件」透過 decode(encoding) 變成「unicode 物件」


注意再 py3  'bytesprefix ' 如果是b 使用.decode('unicode_escape')會有超級差的效能要特別注意。
例如:
d ='{"name": "\\u73cd\\u59ae\\u4f5b\'s Store"}'
print d.decode('unicode_escape')




參考來源:
https://blog.longwin.com.tw/2014/09/python-list-print-chinese-2014/

https://www.ptt.cc/bbs/Python/M.1226931018.A.394.html
http://r97846001.blog.ntu.edu.tw/2015/01/08/python-%E4%B8%AD%E6%96%87%E8%A7%A3%E7%A2%BC%E5%95%8F%E9%A1%8C/
http://blog.chunnorris.cc/2015/04/python-2x-unicode.html#1-程式碼內出現非-ascii-字元