

初めて質問します。

Soalris10環境で日本語ディレクトリ名作成を作成すると文字化けします。  
同様な現象や回避方法を知っている方いますでしょうか。  
最終的には、日本語ファイル名を使わないようにする予定ですが、既存のものを一時的に何とかしたいと考えています。

文字化けする環境と再現手順は、以下の通りです。

[code]

    $ uname -a
    SunOS osc20068 5.10 Generic_147440-27 sun4v sparc sun4v
    $ cat /etc/release
                       Oracle Solaris 10 8/11 s10s_u10wos_17b SPARC
      Copyright (c) 1983, 2011, Oracle and/or its affiliates. All rights reserved.
                                Assembled 23 August 2011
    $ echo $LANG
    ja_JP.UTF-8 
    $
    
    $ mkdir 品 目 品目
    $ ls
    品     目     哇���
    $
    
[/code]

取得した16進ダンプの写しを添付します。

[code]

    $ mkdir a品a b目b c品目c
    $ ls
    a品a b目b c哇���c
    $ ls -d a*
    a品a
    $ ls -d a* | od -cx
    0000000 a 345 223 201 a \n
             61e5   9381   610a
    0000006
    $ ls -d b*
    b目b
    $ ls -d b* | od -cx
    0000000 b 347 233 256 b \n
             62e7   9bae   620a
    0000006
    $ ls -d c*
    c哇���c
    $ ls -d c* | od -cx
    0000000 c 345 223 207 222 233 256 c \n
             63e5   9387   929b   ae63   0a00
    0000011
    
[/code]

追加で取得したダンプです。

[code]

    $ ls
    a品a     b目b     c哇���c
    $ LANG=C ls | od -tx1
    0000000 61 e5 93 81 61 0a 62 e7 9b ae 62 0a 63 e5 93 87
    0000020 92 9b ae 63 0a
    0000025
    $
    
[/code]

historyやlsの結果をファイルに保管、表示した場合は文字化けしませんでした。

[code]

    $ ls
    a品a     b目b     c哇���c
    $ echo a品a b目b c品目c >tmp.txt; cat tmp.txt
    a品a b目b c品目c
    $ history | grep mkdir
      503  mkdir a品a b目b c品目c
      510  history | grep mkdir
    $
    
[/code]

ファイルでも同様に文字化けしました。

[code]

    $ touch 品 目 品目
    $ ls
    品     目     哇���
    $
    
[/code]

文字化けした結果をファイルに保管したものは、文字化けします。  
ファイルシステムの問題かもしれません。

[code]

    $ ls
    品     目     哇���
    $ ls > tmp.txt
    $ cat tmp.txt
    tmp.txt
    品
    目
    哇���
    $
    
[/code]


CC BY-SA 3.0
2016-03-30T04:19:13.097
23610
2016-09-29T12:56:51.987
2016-04-01T00:04:11.243
5285
5285
question
shellscript solaris
Solaris10のファイル名の文字化け


原因は見当も付きませんが、例えばShiftJISの`5c`問題のように特定のバイトが原因になっている可能性があるならば、ファイル名を「品目」から1バイトずつ変えていき、どのバイトを変えると文字化けがなくなるか観察するという手もありますね。

例:

[code]

    # utf-8 で 1byte のみ違う文字列
    擁目      b'\xe6\x93\x81\xe7\x9b\xae'
    唁目      b'\xe5\x94\x81\xe7\x9b\xae'
    哂目      b'\xe5\x93\x82\xe7\x9b\xae'
    品蛮      b'\xe5\x93\x81\xe8\x9b\xae'
    品眮      b'\xe5\x93\x81\xe7\x9c\xae'
    品盯      b'\xe5\x93\x81\xe7\x9b\xaf'
    # sjis で 1byte のみ違う文字列
    吠目      b'\x96i\x96\xda'
    彬目      b'\x95j\x96\xda'
    品瑠      b'\x95i\x97\xda'
    品杢      b'\x95i\x96\xdb'
    # euc-jp で 1byte のみ違う文字列
    癖目      b'\xca\xca\xcc\xdc'
    彬目      b'\xc9\xcb\xcc\xdc'
    品養      b'\xc9\xca\xcd\xdc'
    品杢      b'\xc9\xca\xcc\xdd'
    # iso-2022-jp で 1byte のみ違う文字列
    癖目      b'\x1b$BJJL\\\x1b(B'
    彬目      b'\x1b$BIKL\\\x1b(B'
    品養      b'\x1b$BIJM\\\x1b(B'
    品杢      b'\x1b$BIJL]\x1b(B'
    
[/code]

例の出力に使用したスクリプト:

[code]

    #!/usr/bin/python3
    orig = "品目"
    for enc in "utf-8", "sjis", "euc-jp", "iso-2022-jp":
        print("#", enc, "で 1byte のみ違う文字列")
        new_byte_list = list(bytes(orig, enc))
        for i in range(len(new_byte_list)):
            if enc == "iso-2022-jp" and (i < 3 or i > len(new_byte_list) - 4):
                continue
            new_byte_list[i] += 1
            b = bytes(new_byte_list)
            print(str(b, enc), "    ", b)
            new_byte_list[i] -= 1
    
[/code]


CC BY-SA 3.0
2016-04-05T08:21:07.820
23760
2016-04-05T08:21:07.820
3054
23610
answer


まずは、`$LANG` が環境変数になっている (シェルで `export` されている) こと、`$LC_ALL`
が設定されていないか、値に見えない文字が含まれていないかの確認をしてください。

[code]

    $ env |egrep '^(LANG|LC_ALL)='
    $ printf '%s' "$LANG" |cat -v
    $ printf '%s' "$LC_ALL" |cat -v
    
[/code]

ファイルシステムの問題かもしれないので、マウント元やマウントオプションを確認してください。

[code]

    $ nawk -v m="`df . |sed 's/ .*//'`" '$3==m {print}' /etc/vfstab
    $ mount |grep "^`df . |sed 's/ .*//'` "
    
[/code]

とりあえず、ここまで。原因や、ここまでの操作で得られる情報で何かわかるかは現時点では不明。


CC BY-SA 3.0
2016-06-17T04:02:18.177
26809
2016-06-17T04:02:18.177
3061
23610
answer