Armadilloフォーラム

日本語表示について

kuriha27

2016年9月5日 14時07分

栗原と申します。
いつもお世話になっております。

Armadillo-IoT-G2において、日本語のファイル名を
文字化けしないように表示することは可能でしょうか。

teratermのsshでログインした際に、ファイル名をlsコマンドで
表示した場合に「8月25日開発.c」のファイル名が「8?25???.c」と
表示されてしまいます。

※ファイルの文字コードは、utf-8で保存されているため、catコマンド
 では、文字化けせずにファイルの中身が日本語で表示されます。

ファイル名が文字化けしないように表示する方法はございます
でしょうか。

以上、よろしくお願いいたします。

コメント

cat すると、utf-8 がちゃんと見えるのであれば、console から teraterm までの間には問題がなさそうです。
ls | nkf
とすると、ちゃんと見えますか?
ls | od -x
とすると、思っている utf-8 のバイト列が見えますか?

いつもお世話になっております。
栗原です。

ご回答ありがとうございます。

>ls | nkf
>とすると、ちゃんと見えますか?
→以下の様に表示されました。ATDEで再ビルドが必要でしょうか。

[root@armadillo-iotg (pts/0) /home/ftp/pub]# ls | nkf
ash: nkf: not found

>ls | od -x
>とすると、思っている utf-8 のバイト列が見えますか?
→「8月25日開発.c」ファイルが置いてあるディレクトリにおいて、
 ls | od -xコマンドを実行したところ以下の内容が表示されました。
 バイト列は表示されますが、内容が間違っているように思える
 のですがいかがでしょうか。

[root@armadillo-iotg (pts/0) /home/ftp/pub]# ls | od -x
0000000 3f38 323f 3f35 4a3f 3f3f 632e 000a
0000015

以上、よろしくお願いいたします。

> ash: nkf: not found

すみません。G2 までは、Atmark Dist で nkf は入っていませんでした。
下の情報でわかるので nkf はなくてもよいです。

> →「8月25日開発.c」ファイルが置いてあるディレクトリにおいて、
>  ls | od -xコマンドを実行したところ以下の内容が表示されました。
>  バイト列は表示されますが、内容が間違っているように思える
>  のですがいかがでしょうか。

[root@armadillo-iotg (pts/0) /home/ftp/pub]# ls | od -x
0000000 3f38 323f 3f35 4a3f 3f3f 632e 000a
0000015

アスキーコード[1] と見比べると文字がわかると思いますが、
「?」がそのまま使われています。表示が変なのではなく、
表示されている通りの文字列がファイル名になっていませんか?

3f38 323f 3f35 4a3f 3f3f 632e 000a
? 8 2 ? ? 5 J ? ? ? c .

swap してあげると

8 ? ? 2 5 ? ? J ? ? . c

どうやってファイルを作成したんでしょうか?

[1] http://www.asciitable.com/

いつもお世話になっております。
栗原です。

>どうやってファイルを作成したんでしょうか?
→windows PCのテキストエディタで作成したものを、scpを利用して
 armadilloに送信しました。ファイルを保存する際に文字コードは
 utf-8と指定しております。

また、lsコマンド結果を以下に示します。

[root@armadillo-iotg (pts/0) /home/ftp/pub]# ls
8??25??J??.c

以上、よろしくお願いいたします。

三原と申します。

> >どうやってファイルを作成したんでしょうか?
> →windows PCのテキストエディタで作成したものを、scpを利用して
>  armadilloに送信しました。ファイルを保存する際に文字コードは
>  utf-8と指定しております。

Windows PC から scp した環境を正確に説明お願いできませんか?


- Windows GUI で scp できるアプリケーション
- Windows のコマンドプロンプトからコマンドラインの scp
- Cygwin
- 他いろいろ

Windows のファイルシステム(NTFS、FAT32)はファイル名が UTF-16(Little Endian) です。Windows のファイル名のテキストをバイナリ同値でコピーすると UTF-8 にならないため、Linux のファイルシステムでは文字化けします。

scp するアプリケーションが正しく UTF-16 => UTF-8 変換を行わないと Linux では文字化けするんです。

栗原さんが提示なされたバイト列は、swap すると 8??... となんとなく漢字が化けているように見えるのですが、UTF-16 では全て 2 バイト(以上)文字になるのに '8' や '2' '5' が 1 バイトになっているので、ASCII 文字が 1 バイトになり ASCII 範囲外が UTF-16 のまま Armadillo に伝えられていると想像します。

> scp するアプリケーションが正しく UTF-16 => UTF-8 変換を行わないと Linux では文字化けするんです。

そうなんですね。

Windows に詳しくないので、とても助かります。
ありがとうございます。

岩川と申します

これは以下の2つのどちらかが原因です。

1. ロケール関連の環境変数の問題
2. ls自体の問題

まず1.ですが、LANG=Cなど日本語以外になっているか、なっていても端末などの設定と整合性がとれていない場合は文字化けが起こります。

ただし、今回の場合は恐らく2.が原因と思われます。

lsによる出力結果を例えば

  ls | od -t x1

のようにして中身を見た場合、期待される結果は

  0000000 38 e6 9c 88 32 35 e6 97 a5 e9 96 8b e7 99 ba 2e
           8       月  2  5       日       開       発  .
  0000020 63 0a
           c LF

ですが、実際には、

  0000000 38 3f 32 35 3f 3f 3f 2e 63 0a
           8  ?  2  5  ?  ?  ?  .  c LF

となっているはずで、これはls自体がUTF-8を含めたマルチバイト文字に対応した動作をしていないためです。というよりASCII以外の出力を抑制して「?」に置き換えています。

debianなどに普通に入っているGNU coreutilsのlsであれば、このような場合

  ls --show-control-chars

とすれば無理やり表示できますが、Atmark-Distの場合は確かBusyboxのlsなのでこのオプションはありません。これは例えばUbuntu 16.04のパッケージにあるBusyboxで試しても同じようになります。

どうしてもlsを日本語対応させたい、というのであれば、

a. ARM版のdebianあたりからcoreutilsのls(/bin/ls)をコピーする
b. busyboxをマルチバイト文字対応に設定変更・リビルドする

のどちらかだと思います。

busyboxをリビルドする場合、make menuconfigで以下の部分を変更します。

  Busybox Settings --->
    General Configuration --->
      [*] Support Unicode                          <= チェックする
      (0)   Range of supported Unicode characters  <= 「0」にする
      [*]   Allo wide Unicode characters on output <= チェックする

.configを直接編集する場合は以下を変更すればよいはずです。

  CONFIG_UNICODE_SUPPORT=y
  CONFIG_LAST_SUPPORTED_WCHAR=0
  CONFIG_UNICODE_COMBINING_WCHARS=y
  CONFIG_UNICODE_WIDE_WCHARS=y

ただし手元で試したのは最新版(1.25.0)をUbuntu 16.04上でなので、Atmark-Distのバージョンでは有効かどうかは未確認です。

いつもお世話になっております。
栗原です。

以下の内容で解決いたしました。ありがとうございました。

>Windows PC から scp した環境を正確に説明お願いできませんか?

ファイルは、windowsPCにてサクラエディタを使用して作成しました。
ファイルを保存する際に、文字コードセットでUTF-8、改行コードを
LFにして保存しました。

armadilloへのファイルの移動は、WinSCPを用いています。転送プロトコル
はSCPを用いており、全てGUIで操作しております。

WinSCPでは、「ファイル名をUTF-8でエンコード」の設定をオンにしました。

>a. ARM版のdebianあたりからcoreutilsのls(/bin/ls)をコピーする
>b. busyboxをマルチバイト文字対応に設定変更・リビルドする
>のどちらかだと思います。
>busyboxをリビルドする場合、make menuconfigで以下の部分を変更します。

Atmak-Distのbusyboxのバージョンは、busybox-1.20.2でした。
bushboxのリビルドでは、.configを直接編集しました。

  CONFIG_UNICODE_SUPPORT=y
  CONFIG_LAST_SUPPORTED_WCHAR=0
  CONFIG_UNICODE_COMBINING_WCHARS=y
  CONFIG_UNICODE_WIDE_WCHARS=y

「a. ARM版のdebianあたりからcoreutilsのls(/bin/ls)をコピーする」は試していません。。

以上の修正で解決しました。ありがとうございました。