打开属性文件时出现奇怪的字符

时间:2015-07-29 08:01:20

标签: encoding properties-file

我需要更新一个非常古老的项目的属性文件,属性文件应该显示阿拉伯字符,但它显示的内容类似于“ÊãÊÓÌíáØáÈßã”,我写了一个简单的程序,我能够从文件中读取正确的阿拉伯语值

Reader r = new InputStreamReader(new  FileInputStream("C:\\Labels_ar.properties"), "Windows-1256");
buffered = new BufferedReader(r);
String line;          
while ((line = buffered.readLine()) != null) {
    System.out.println("line" + line);
    }

但您对我如何打开文件,编辑和保存新更改有任何想法吗?

2 个答案:

答案 0 :(得分:1)

如果您认为编码是Windows-1256,那么有编辑可以完成这项工作,例如EditPadLite

如果不是这样,你需要找出的第一件事就是编码。鉴于它是一个属性文件,它可能是UTF-8,但最简单的方法是获取文件的十六进制转储并在此处发布。在Linux下,我通常建议使用:

od -xcb Labels_ar.properties

但是,如果你在Windows上,那就不会那么好了(除非你安装了CygWin)。

所以,如果您有自己喜欢的十六进制转储程序,那就使用它。否则,您可以使用以下Powershell:

function Pf-Dump-Hex-Item([byte[]] $data) {
    $left = "+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F"
    $right = "0123456789ABCDEF"
    Write-Output "========  $left +$right"

    $addr = 0
    $left = "{0:X8}  " -f $addr
    $right = ""

    # Now go through the input bytes

    foreach ($byte in $bytes) {
        # Add 2-digit hex number then filtered character.

        $left += "{0:x2} " -f $byte
        if (($byte -lt 0x20) -or ($byte -gt 0x7e)) { $byte = "." }
        $right += [char] $byte

        # Increment address and start new line if needed.

        $addr++;
        if (($addr % 16) -eq 0) {
            Write-Output "$left $right"
            $left = "{0:X8}  " -f $addr
            $right = "";
        }
    }

    # Flush last line if needed.

    $lastLine = "{0:X8}" -f $addr

    if (($addr % 16) -ne 0) {
        while (($addr % 16) -ne 0) {
            $left += "   "
            $addr++;
        }
        Write-Output "$left $right"
    }
    Write-Output $lastLine
    Write-Output ""
}

function Pf-Dump-Hex {
    param(
        [Parameter (Mandatory = $false, Position = 0)]
            [string] $Path,
        [Parameter (Mandatory = $false, ValueFromPipeline = $true)]
            [Object] $Object
    )

    begin {
        Set-StrictMode -Version Latest

        # Create the array to hold content then do path if given.

        [byte[]] $bytes = $null
        if ($Path) {
            $bytes = [IO.File]::ReadAllBytes((Resolve-Path $Path))
            Pf-Dump-Hex-Item $bytes
        }
    }

    process {
        # Process each object (input/pipe).

        if ($object) {
            foreach ($obj in $object) {
                if ($obj -is [Byte]) {
                    $bytes = $obj
                } else {
                    $inpStr = [string] $obj
                    $bytes = [Text.Encoding]::Unicode.GetBytes($inpStr)
                }
                Pf-Dump-Hex-Item $bytes
            }
        }
    }
}

如果您将其加载到Powershell会话中,请运行:

pf-dump-hex Labels_ar.properties

应该允许您评估文件编码。

答案 1 :(得分:-1)

我认为有两个问题: 1-我不确定System.out.println()是否可以打印阿拉伯字符,所以尝试使用另一种方法,如MessageBox.show(),以确保读取文件有问题。 2-如果MessageBox.show()显示相同的结果,问题应该是charset,你可以尝试使用UTF-8或其他东西。