見出し画像

プログラマー探偵の事件簿:見えないスペースの恐怖

久しぶりに不思議な事件に遭遇した。助手の老猫は暑い日が続いて体調不良だが朝の4時に私を起こして大活躍した話である。

事件の始まり

TWSNMP FCのセンサーシリーズTWBlueScanを開発していた時の話である。BlueToothのデバイスが送信する情報に製造元メーカーを識別する数値があることがわかった。この数値と人間が読めるメーカー名の対応は、

のサイトにあることを知って、ここからCSVファイルをダウンロードした。
CSVのデータをGO言語のプログラムから使えるように、

func loadVendorCode() {
	f, err := os.Open("CompanyIdentfiers - CSV.csv")
	if err != nil {
		return
	}
	r := csv.NewReader(f)
	for {
		record, err := r.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			log.Fatal(err)
		}
		if len(record) != 3 || record[0] == "Decimal" {
			continue
		}
		//		fmt.Println(record)
		if c, err := strconv.ParseInt(record[0], 10, 16); err == nil {
			vendor := record[2]
			vendor = strings.ReplaceAll(vendor, ",", ".")
			vendor = strings.ReplaceAll(vendor, ";", ":")
			vendor = strings.ReplaceAll(vendor, "\"", "'")
			vendorMap[uint16(c)] = vendor
			fmt.Printf("0x%04x:\"%s\",\n", c, vendor)
		}
	}
}

のようなプログラムで変換した。このデータを目的のプログラムに組み込んだ時の話である。

画像1

エラーが沢山表示された!

何が違うのかわからない

エラーの発生場所のソースコードを見てみる。

画像2

下線のついたエラーのある行と下線のない正常な行の違いが私にはわからない。途方にくれていると寝ていた猫が起き上がり少し歩いて座った。そのまま何もない空間をしばらく見つめた後、
「人間には見えないものがある!」
とアドバイスをくれた。

人間には見えないものがある

気を取り直してエラーのメッセージをまじめに読んでみた。

画像3

string literal contains the Unicode format character U+200B, consider using the '\u200b' escape sequence insteadST1018

どうやらU+200Bという文字がよくないらしい。素直にGoogleさんにU+200Bと聞いてみた。

を見つけた。
幅がゼロのスペースだった。人間には見えないはずだ!

2021-08-28_07-36-44のコピー

どうやら会社名の先頭にゼロ幅スペースがあったようだ。手作業でも削除できたが、VS Codeのクイックフィックスで削除と変換の二種類の方法が示されていた。
解決を察知した老猫は、ぐっすり寝ている。
しかし、会社名の先頭にゼロ幅スペースが必要なのかは謎のままである。

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。