日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最近对latin-1这个字符集产生了不少好感

發布時間:2023/12/6 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最近对latin-1这个字符集产生了不少好感 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

簡介

  最近我要解析一個數據庫中間件的日志、這個中間件會在日志中記錄SQL發往的后臺DB ,執行耗時,對應的SQL;中間件直接把SQL寫到

  了日志中去,并沒有對SQL進行適當的編碼轉換;理想情況下這個也不會有什么問題,不幸的是我就面對著這種情況,client的發給中間件

  的SQL有可能是"utf-8",也有可能是"gbk",也有可能是"gb2132";所以使用中間件的日志文件用任何一種編碼方式都不成正確的解碼它,

  

  幸運的是我要做的工作只要解決出日志中所涉及到的數據庫名和表名就行,所以我并不一定要完全解碼這個文件。

?

復現一下那個中間件寫日志的大致邏輯

以下我會用python代碼來描述上面的情況,可以看到對于同一個文件以不同的編碼寫入了內容

with open('proxy_backup_sql.log','bw') as user_log_hander:user_log_hander.write("192.186.100.10 | 0.012 | select id from tempdb.person where name='張三'; \n".encode('utf8'))user_log_hander.write("192.186.100.10 | 0.012 | select id from tempdb.person where name='楊白勞'; \n".encode('gbk'))

  

  對于上面的情況不管你是用utf-8 還是用gbk打開文件它們會亂碼的、

?

?

用什么編碼都是不可能正常打開這個文件的

?1、UTF8打開

with open('proxy_backup_sql.log','r',encoding='utf8') as proxy_backup_log_handler:for line in proxy_backup_log_handler:print(line,end='')Traceback (most recent call last):File "main.py", line 22, in <module>for line in proxy_backup_log_handler:File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/codecs.py", line 321, in decode(result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd1 in position 142: invalid continuation byte

?

2、用gbk打開

with open('proxy_backup_sql.log','r',encoding='gbk') as proxy_backup_log_handler:for line in proxy_backup_log_handler:print(line,end='')192.186.100.10 | 0.012 | select id from tempdb.person where name='寮犱笁'; 192.186.100.10 | 0.012 | select id from tempdb.person where name='楊白勞';

可以看到沒有報異常、但是這個只是巧合、gbk剛好能解碼utf8編碼下的“張三”并把它解碼成了“寮犱笁”

?

latin-1 有的牛逼之處

  latin-1 這個字符集的牛逼之處、latin-1字符集是在ascii碼上的一個擴展,它把ascii碼沒有用到過的字節碼都給編上了對應的字符,所以它能表示

  的字符就更多了;針對單個字節來說就沒有它不能解碼的,這個就是它的牛逼之處所在。也就是說當我們不在乎內容中多字節碼的正確怕的情況

  下使用latin-1字符集是不會出現解碼異常的

?

  以下代碼可以說明latin-1可以解碼任意的單個字節

#!/usr/bin/env python3 #! -*- coding:utf8 -*- ba = bytearray(256) for i in range(256):ba[i]=iprint("number = {0} char = {1}".format(i,ba[i:i+1].decode('latin-1')) )

?

在我們不在乎多字節碼的情況性的情況下latin-1真的是無敵了

  latin-1可以解碼任意文件如果你只是在意單字節碼中的內容的話

#!/usr/bin/env python3 #! -*- coding:utf8 -*-if __name__ == "__main__":with open('proxy_backup_sql.log','r',encoding='latin-1') as proxy_backup_log_handler:for line in proxy_backup_log_handler:print(line,end='')

  可以看到如下的輸出

192.186.100.10 | 0.012 | select id from tempdb.person where name='?? ??'; 192.186.100.10 | 0.012 | select id from tempdb.person where name='??°×àí';

  雖然是亂碼,但是絕對不會有異常發生。

?

---

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的最近对latin-1这个字符集产生了不少好感的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。