kuriha27
2016年9月5日 14時07分
栗原と申します。
いつもお世話になっております。
Armadillo-IoT-G2において、日本語のファイル名を
文字化けしないように表示することは可能でしょうか。
teratermのsshでログインした際に、ファイル名をlsコマンドで
表示した場合に「8月25日開発.c」のファイル名が「8?25???.c」と
表示されてしまいます。
※ファイルの文字コードは、utf-8で保存されているため、catコマンド
では、文字化けせずにファイルの中身が日本語で表示されます。
ファイル名が文字化けしないように表示する方法はございます
でしょうか。
以上、よろしくお願いいたします。
コメント
kuriha27
いつもお世話になっております。
栗原です。
ご回答ありがとうございます。
>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
以上、よろしくお願いいたします。
at_yashi
> 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
どうやってファイルを作成したんでしょうか?
kuriha27
access.mihara
三原と申します。
> >どうやってファイルを作成したんでしょうか?
> →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 に伝えられていると想像します。
at_yashi
yi_td
岩川と申します
これは以下の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のバージョンでは有効かどうかは未確認です。
kuriha27
いつもお世話になっております。
栗原です。
以下の内容で解決いたしました。ありがとうございました。
>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)をコピーする」は試していません。。
以上の修正で解決しました。ありがとうございました。
at_yashi
2016年9月6日 10時07分
cat すると、utf-8 がちゃんと見えるのであれば、console から teraterm までの間には問題がなさそうです。
ls | nkf
とすると、ちゃんと見えますか?
ls | od -x
とすると、思っている utf-8 のバイト列が見えますか?