1. 程式人生 > >最近對latin-1這個字符集產生了不少好感

最近對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]=i
    print("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這個字符集產生不少好感

【簡介】   最近我要解析一個數據庫中介軟體的日誌、這個中介軟體會在日誌中記錄SQL發往的後臺DB ,執行耗時,對應的SQL;中介軟體直接把SQL寫到   了日誌中去,並沒有對SQL進行適當的編碼轉換;理想情況下這個也不會有什麼問題,不幸的是我就面對著這種情況,client的發給中介軟體   的SQL有可能

中國歷史上5個謠言,單是第1條就騙不少人!

內部 說明 道理 技術分享 -i 取代 統一 三國 並不是 謠言1:嘉慶要殺和珅,和珅拿出乾隆留下的保命密信,打開一看卻傻了眼,上邊寫著三個字:“留全屍”。 【真相】:這個橋段其實是小說和電視劇裏杜撰的,只是為了增加劇情的需要,但卻被當成了歷史上的真事。身為清朝第一

網易面試題之 牛牛的作業薄上有一個長度為 n 的排列 A,這個排列包含1到n的n個數,但是因為一些原因, * 其中有一些位置(不超過 10 個)看不清,但是牛牛記得這個數列順序的數量是 k,

package wangyi; /** * Created by Administrator on 2016/12/7. * 牛牛的作業薄上有一個長度為 n 的排列 A,這個排列包含了從1到n的n個數,但是因為一些原因, * 其中有一些位置(不超過 10 個)看不清

【轉載】最近不少java開發,據此來說下我的感受:哪怕事先只准備1小時,成功概率也能大大提升

原文連結:https://www.cnblogs.com/JavaArchitect/p/9032323.html   本人最近幾年一直在做java後端方面的技術面試官,而在最近兩週,又密集了面試了一些java初級和高階開發的候選人,在面試過程中,我自認為比較慎重,遇到問題回答不好的候選人,我總會再

做IT的你架構師這個基層技術管理工作解的有多少

本文由摘自“光環國際”—中國專案管理PMP培訓上市企業轉載 1.企業級架構師(Enterprise Architect)企業級架構師立足於企業級別的IT系統架構,主要關注的是如何把IT的能力對映到企業的商業需要中。所以,企業級架構師所關注的主要是IT與商業之間的關係、商

win8/win8.1提示在關閉使用者控制的情況下 無法開啟這個應用

方法一:賦予管理員使用metro應用的許可權,具體步驟,開啟控制面板,檢視方式設為大圖示,以此找到管理工具--本地安全策略--本地策略--安全選項,在右側的視圖裡找到“使用者帳戶控制: 對內建管理員帳戶使用管理審批模式”,雙擊或者右鍵屬性,啟用,重啟電腦。方法二:因為Win8的Metro應用在關閉UAC的情

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-3: ordinal not in range(256)

clas mysq mic swd pass pan 天使 -1 root 今天使用MySQLdb往MySQL插入中文數據遇到一個異常: UnicodeEncodeError: ‘latin-1‘ codec can‘t encode characters in posit

大數據,只看這個就夠

性能 語言 order nbsp 人工 之間 hdf ima 數據運維 2016年5月25日上午,由貴州省政府舉辦的以"大數據開啟智能時代"為主題的中國大數據產業峰會在貴陽開幕,國務院總理李克強發表主旨演講。騰訊集團馬化騰,高通公司總裁Derek Aberle,百度

2017 5 31 php面向過程 面向1

語法 存儲 his 調用 定義 屬性 類常量 流程 通過 面向過程的語法定義變量;定義函數;使用變量(輸出,賦值,等)調用函數;流程控制(if,switch,for,while等) 面向對象的語法1,定義類;定義類的語法中,只有這3種代碼:1.1定義屬性(變量)1.2定義方

作為程序猿,怎麽證明你的代碼打得穩?這個回答絕

blog 女孩子 打了 安排 美麗 地址 兩個 喜歡 images 小偉畢業後順利的進了一家軟件公司,他天生就是幹這行的料。不愛說話,不善於言談,熱衷於解決程序中的難題,程序員的這些標簽都貼在了他的身上。 每次解決一個難題,小偉總習慣對著電腦傻笑一會。剛開始大家都以為他

Lua程序設計之————Lua面向1

pre cal oca () cti 輸出 alt 想象 完整 完整代碼 local mt = {} mt.__add = function(t1,t2) print("兩個Table 相加的時候會調用我") end local t1 = {} loca

第五章:面向1

沒有 值傳遞 默認 封裝性 軟件開發 大型項目 語句 開發思想 實現 面向對象和面向過程的區別 兩者都是軟件開發思想,先有面向過程,後有面向對象。在大型項目中,針對面向過程的不足推出了面向對象開發思想。區別1. 編程思路不同: 面向過程以實現功能的函數開發為主,而面向對象要

【算法設計與分析基礎】15、最近問題

filename com 算法設計 2個 junit 開始 替換 lis 之間 1、由於Java中沒有存放單個鍵值對的類型使用起來不是很方便 package cn.xf.util; /** * * 功能:相當於一個key value * @author xi

k進制正整數的k-1取余與按位取余

散列函數 輸入 frame 整除 data- display order view ren 華電北風吹 天津大學認知計算與應用重點實驗室 日期:2015/8/24 先說一下結論 有kk進制數abcdabcd,有abcd%(k?1)=(a+b+c+

三、面向象——1-類和

align this -a tro str 定義 p s 面向對象 style 1-類和對象 1.定義類 2.對象的產生和使用 3.對象、引用和指針 4.this三、面向對象——1-類和對象

Laravel5.1 -控制器(初步解)

remove 喜歡 style 方法 function edit logs ora pla 首先道個歉 這篇筆記是前兩天就應該寫的,可大K有點事兒要忙 就耽誤了,今天抽空學了學控制器,並寫個筆記分享下。 為什麽要使用控制器 像我們之前寫一些邏輯呢都是在Route(路由)中,

Jexus~docker與它產生暖味

mvc framework docker 瀏覽器 mon 刪除 閱讀 ext erl 前段時間寫了很多docker for .net core的文章,用來快速部署微服務相當給力,而嘗到了香頭的我們希望把.net frameworks的程序也使用docker來部署一下,那麽接

oracle(查詢數據庫1)

hist sta column 文件中 groups 啟動 segment 控制 pac 1 --查詢表信息 2 xxx_tables--包含表的基本描述信息和統計信息 3 xxx_tab_columns--包含表中列的描述信息和統計信息 4 xxx_all_ta

談一談,你軟件測試行業的

可能 之前 測試執行 軟件設計 補丁 穩定 tro 人員 開發 1、提高軟件的質量:軟件穩定,軟件達到客戶的需求2、軟件測試的目的:發現軟件缺陷,提高軟件質量,發現盡可能多的問題,各種場景各種情況下是否有問題3、微軟這個牛逼的公司,wingdow要升級,軟件要打補丁。測試時

使用python 3.x pythonchallenge-----1的解答過程

col rcc int 是什麽 則表達式 .html ring ply 字符 pythonchallenge-1地址 : http://www.pythonchallenge.com/pc/def/274877906944.html圖片如下:題目解析:看圖也不懂是什麽意思,