「エキスパートたちのGo言語」という書籍を購入し(2022年1月12日)、勉強をし出したところ(2024年5月1日)、サンプルコードがありダウンロードした。https://gihyo.jp/book/2022/978-4-297-12519-6/support
サンプルコードは、txtファイルであった。
txtファイルをgoファイルへ
せっかくならgoファイルに変換し、エディターを使っていじったり動かしたりしたかったので、取り急ぎ全ファイルを変換することに。
しかし、txtファイルのエンコードがまちまちで、そのまま変換すると文字化けするので、良い方法を探したが、結論から言うと見つからなかった。
一応、何をしたか備忘録をとることに。
やったこと
pythonで、各txtファイルからエンコーディングの種類を読み込み、各txtファイルを各エンコーディングで開き、UTF-8でエンコーディングし閉じる
Go言語で、ファイルの拡張子を txt → go へ変換
結果、Windows-1254 は UTF-8 にうまくエンコードできず、文字化けした
コード
これは、とりあえずpython使って、エンコーディングを検出してるだけのコード
import os
import chardet
def detect_encoding(file_path):
with open(file_path, 'rb') as f:
rawdata = f.read()
return chardet.detect(rawdata)['encoding']
def detect_encodings_in_folder(folder_path):
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith('.txt'):
file_path = os.path.join(root, file)
encoding = detect_encoding(file_path)
print(f'File: {file_path}, Encoding: {encoding}')
# 基準フォルダパスを指定
folder_path = '.'
detect_encodings_in_folder(folder_path)
続いて、python使ってエンコーディングを検出し、検出したエンコーディングでファイルを開いて、UTF-8でエンコードするつもり...うまく行かなかった
import os
import chardet
import codecs
i = 0
def convert_encoding(file_path, target_encoding='utf-8'):
global i
i += 1
# Detect current encoding
with open(file_path, 'rb') as f:
rawdata = f.read()
current_encoding = chardet.detect(rawdata)['encoding']
print(i,": befor_current_encoding :",current_encoding)
# Open the file in the detected encoding
with codecs.open(file_path, 'r', encoding=current_encoding, errors='ignore') as f:
content = f.read()
# Write the content back to the file in the target encoding
with codecs.open(file_path, 'w', encoding=target_encoding) as f:
f.write(content)
# Chack current encoding
with open(file_path, 'rb') as f:
rawdata = f.read()
current_encoding = chardet.detect(rawdata)['encoding']
print(i, ": after_current_encoding :",current_encoding)
def convert_encodings_in_folder(folder_path):
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith('.txt'):
file_path = os.path.join(root, file)
convert_encoding(file_path)
# 基準フォルダパスを指定
folder_path = '.'
convert_encodings_in_folder(folder_path)
続いてGoを使って、拡張子の変更
package main
import (
"os"
"path/filepath"
"strings"
)
func visit(path string, f os.FileInfo, err error) error {
if !f.IsDir() && strings.HasSuffix(path, ".txt") && !strings.HasSuffix(path, "README.txt") {
newPath := strings.TrimSuffix(path, filepath.Ext(path)) + ".go"
os.Rename(path, newPath)
}
return nil
}
func main() {
root := "." // 基準フォルダパスを指定
filepath.Walk(root, visit)
}
結局うまく行かんかったし、全然Go言語の勉強が出来なかった😨