解決編碼問題追蹤

2021-09-19 19:29:50 字數 1730 閱讀 4477

背景:現有的檔案編碼型別是「utf-8 unicode text」型別的,但是需要檔案的型別是「iso-8859 text, with crlf line terminators」的

在這樣的需求之下並不能直接將檔案型別轉換成「iso-8859」型別,iso-8859有iso-8859-1,iso-8859-2,.....,iso-8859-9多個形式,無法直接轉成iso-8859。

之前是通過「cat filename | iconv -f'utf8' -t'gb18030'」的命令就可以轉換了,但是這次發現同樣的命令卻換成了「non-iso extended-ascii text」型別。後來發現是因為在filename中某行檔案比較不同,例如轉換前627行,可以轉換成功,但是轉換628行的時候就失敗,然後將628行去掉之後就能成功,說明該行有問題,但是不知道是什麼問題。

檔案末尾出現「with crlf line terminators」說明檔案是dos編碼的,不是linux的編碼,我們用cat -v test.sh 可以看到^m (\r的十六進製制為0d,對應的控制符為^m)。 cat -v可以看到檔案中的非列印字元。

可以通過開啟vim設定:

:set ff=unix

:set ff=dos

來改變。

通過"file -b filename"可以檢視檔案的編碼型別:

通過「file -b --mime-encoding synonym_dict_qtt」 可以顯示更詳細的資訊:

再查了很多資料之後還是束手無策,問題就是由於檔案中的某行資料不規範,在用iconv轉換的過程中會使得轉換失敗,因此需要去除不規範的那一行。可以寫乙個shell指令碼,指令碼處理過程是逐行遍歷轉換成資料,轉換之後用file和grep檢視資料是不是正確的格式,如果不是說明此行有誤,就去掉改行;若沒錯就繼續遍歷。shell**如下所示:

function get_real_symdata()

if [ $zt_len -gt 0 ]

then

echo "drop this line"

sed -i $line'd' $table_name

line=$[$line-1]

else

echo "continue"

fidone

}

這樣就能無誤的轉換了。

二,codecs庫

import codecs

fw = codecs.open('test1.txt','a','utf-8')

fw.write(line2)

# 更快速的寫法

test_docs = [x.strip().split() for x in codecs.open(test_docs, "r", "utf-8").readlines()]

而codecs提供的方法可以指定乙個編碼開啟檔案,使用這個方法開啟的檔案讀取返回的將是unicode。寫入時,如果引數是unicode,則使用open()時指定的編碼進行編碼後寫入;如果是str,則先根據源**檔案宣告的字元編碼,解碼成unicode後再進行前述 操作。相對內建的open()來說,這個方法不容易在編碼上出現問題。

Raytracing 光線追蹤的問題和解決方案

問題 1 效能 演算法的遞迴性質和大數目的追蹤光線,渲染過程可能持續數小時。80 90 的渲染時間花費在計算光線和物體交點上。2 走樣 3 尖銳的陰影 基本的光線追蹤演算法只能得到尖銳的陰影 因為模擬的是點光源 4 區域性光照和著色 演算法只追蹤少數目的光線,只有四種型別的光線被考慮在內,物體之間的...

oracle 編碼問題 討論解決

al32utf8和utf8字符集有什麼區別和聯絡?al32utf8 支援更高版本的unicode 3.1 而且,al32utf8只支援9i以及更高版本的資料庫 utf8既可以作為資料庫字符集,也可以作為國家字符集 9i al32utf8只能作為資料庫字符集 oracle 客戶端執行select fr...

解決中文編碼的問題

一 頁面要指定編碼 1 靜態頁面 需指定 2 動態頁面 servlet resp.setcontenttype text html charset utf 8 printwriter out resp.getwriter 二 表單提交 1 post方式提交 servlet在獲得表單資料之前,需要呼叫...