Nimで文字列エンコードを変換する話です.

「さて、全地は一つのことば、一つの話しことばであった。」(創世記11:1)

文字エンコードを変更するには encodings モジュールを用います.この記事ではNim0.18.0を用います

函数

https://nim-lang.org/docs/encodings.html の函数の部分を雰囲気で翻訳しただけ

open(destEncoding = “UTF-8”; srcEncoding = “CP1252”): EncodingConverter

EncodingConverterを生成します.srcEncodingからdestEncodingに変換されます.生成に失敗するとエラーを投げます.

close(c: EncodingConverter)

上のEncodingConverterを使い終わったらリソースを開放する函数です.

convert(c: EncodingConverter; s: string): string

EncodingConverterを使って文字列を変換します.入力文字列はsrcEncodingであると仮定されます.

convert(s: string; destEncoding = “UTF-8”; srcEncoding = “CP1252”): string

EncodingConverterをわざわざ立てるのがめんどくさいときはこれでも出来ますが,いちいちopenしてcloseするので効率は悪いです.

Shift-JISのテキストをUTF-8に変換します.

sjis.txt (Shift-JIS)

いろは

a.nim

import os, strutils, streams, encodings,unicode
block:
  var f = open("sjis.txt", Filemode.fmread)
  var sjisstr = f.readLine
  f.close
  var utf8str = sjisstr.convert(srcEncoding="shift_jis")
  var sjis2utf8 = open("UTF-8","shift_jis")
  var usingEncodingConverter = sjis2utf8.convert(sjisstr)
  sjis2utf8.close
  echo (sjisstr,utf8str,usingEncodingConverter)

出力

(Field0: "\x8B\xE0\x95\xBD\x93\x9C", Field1: "\xE9\x87\x91\xE5\xB9\xB3\xE7\xB3\x96", Field2: "\xE9\x87\x91\xE5\xB9\xB3\xE7\xB3\x96")

UTF-8に変換できました.UTF-8をNimで扱う方法は,また少しめんどくさいのでそのうち書きます.

補足

UNIX系の場合,裏でiconv呼んでいるだけっぽいので,cp932とか指定できます.指定できるエンコード一覧は,iconv -lと叩くと見ることが出来ます.もしくは http://ama-ch.hatenablog.com/entry/20081204/1228371690 を参照.

WINDOWSの場合, https://github.com/nim-lang/Nim/blob/master/lib/pure/encodings.nimwinEncodings の中身が使えます(試していません).