相关疑难解决方法(0)

设置默认的Java字符编码?

如何以编程方式正确设置JVM(1.5.x)使用​​的默认字符编码?

我已经读过-Dfile.encoding=whatever以前用于旧JVM的方法......由于我不会进入的原因,我没有那么奢侈.

我试过了:

System.setProperty("file.encoding", "UTF-8");
Run Code Online (Sandbox Code Playgroud)

并且属性已设置,但它似乎不会导致下面的最终getBytes调用使用UTF8:

    System.setProperty("file.encoding", "UTF-8");

    byte inbytes[] = new byte[1024];

    FileInputStream fis = new FileInputStream("response.txt");
    fis.read(inbytes);
    FileOutputStream fos = new FileOutputStream("response-2.txt");
    String in = new String(inbytes, "UTF8");
    fos.write(in.getBytes());
Run Code Online (Sandbox Code Playgroud)

java utf-8 character-encoding

342
推荐指数
10
解决办法
62万
查看次数

为什么Java的String.getBytes()使用"ISO-8859-1"

来自java.lang.StringCoding:

String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;
Run Code Online (Sandbox Code Playgroud)

这是从Java.lang.getBytes()中使用的,在linux jdk 7中我总是认为UTF-8是默认的字符集?

谢谢

java utf-8 iso-8859-1 character-encoding

17
推荐指数
3
解决办法
4万
查看次数

作为Upstart服务启动时,无法读取UTF-8文件名

我的Java程序以递归方式读取目录的内容.这是一个示例树(请注意非ASCII字符):

./sviluppo
./sviluppo/ciaò
./sviluppo/ciaò/subdir
./sviluppo/pippo
./sviluppo/pippo/prova2.txt <-file
./sviluppo/così
Run Code Online (Sandbox Code Playgroud)

该程序作为Upstart服务启动,其配置文件名为 /init/myservice.conf

description "Private Service"
author "AD"
start on runlevel [2345]
stop on runlevel [! 2345]
exec java -jar /home/mainFind.jar >> /tmp/log.txt
Run Code Online (Sandbox Code Playgroud)

当我启动服务时:

root@mdr:/tmp#  service myservice start
myservice start/running, process 15344
Run Code Online (Sandbox Code Playgroud)

它不会在名称中记录带有非ASCII字符的文件名:

root@mdr:/tmp#  cat /tmp/log.txt
Found dir: /mnt/sviluppo/pippo
Run Code Online (Sandbox Code Playgroud)

相反,当我运行命令时(以root身份,模仿它作为服务启动时会发生什么)它可以正常工作,有和没有exec:

root@mdr:/tmp# java -jar /home/mainFind.jar  >> /tmp/log.txt
root@mdr:/tmp# exec java -jar /home/mainFind.jar  >> /tmp/log.txt

root@mdr:/tmp#  cat /tmp/log.txt
Found dir: /mnt/sviluppo/ciaò
Found dir: /mnt/sviluppo/ciaò/subdir
Found dir: /mnt/sviluppo/pippo
Found dir: /mnt/sviluppo/così
Run Code Online (Sandbox Code Playgroud)

为什么同一个用户运行的同一个程序在Upstart服务中不起作用,但是从命令行运行时是否正确处理了所有文件名?这是Java代码

public static …
Run Code Online (Sandbox Code Playgroud)

java ubuntu service special-characters

15
推荐指数
1
解决办法
2309
查看次数

Mac上的logback返回问号而不是单词

我刚刚开始使用logback来记录在glassfish3 AS上运行的Java项目,我注意到了一些奇怪的事情.这段代码

LOG.error("?????????? {} ??? ???????????.", calc);
Run Code Online (Sandbox Code Playgroud)

如果我在Windows上运行我的应用程序,则生成正常的预期输出.但如果我在Mac上的配置相同,我会有问号而不是文字,如下所示:

15:37:29.083 ERROR r.g.g.c.TotalNachController - ?????????? [id=8871] ??? ???????????.
Run Code Online (Sandbox Code Playgroud)

我的logback配置是:

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>../logs/logback.log</file>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} %-5level %logger{35} - %msg%n</pattern>
    </encoder>
</appender>
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我,我做错了什么?

java macos logging glassfish logback

7
推荐指数
1
解决办法
2357
查看次数

file.encoding无效,LC_ALL环境变量就可以了

在使用OpenJDK 1.6.0_22在Linux中运行的以下Java程序中,我只是在命令行中列出作为参数获取的目录的内容.该目录包含文件名为UTF-8的文件(例如印地语,普通话,德语等).

import java.io.*;

class ListDir {

    public static void main(String[] args) throws Exception {
    //System.setProperty("file.encoding", "en_US.UTF-8");
        System.out.println(System.getProperty("file.encoding"));
    File f = new File(args[0]);
    for(String c : f.list()) {
        String absPath = args[0] + "" + c;
        File cf = new File(args[0] + "/" + c);
        System.out.println(cf.getAbsolutePath() + " --> " + cf.exists());
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我将LC_ALL变量设置为en_US.UTF-8,则结果打印正常.但是如果我将LC_ALL变量设置为POSIX并从命令行提供file.encoding和sun.jnu.encoding属性为UTF-8,则得到垃圾输出,cf.exists()返回false.

你能解释一下这种行为吗?正如我在很多网站上看到的那样,file.encoding足以读取文件名并将其用于操作.在这里看起来该属性根本没有效果.

更新1:如果我将file.encoding设置为GBK(中文)和LC_ALL变量设置为en_US.UTF-8,则cf.exists()返回true.只有 '?' 出现而不是文件名.惊喜o_O.

更新2:更多调查,看起来它不是Java问题.看起来Linux上的libc使用区域设置来翻译文件名编码,这些设置将导致文件未找到错误/异常."file.encoding"是指Java如何解释文件名.

更新3现在看来问题是Java如何解释文件名.以下简单的C代码适用于Linux,无论文件编码和LC_ALL环境变量的值如何(我很高兴这证明了这里给出的答案:https://unix.stackexchange.com/questions/39175/understanding-unix-file-名称编码).但我还不清楚Java如何解释LC_ALL变量.现在查看OpenJDK代码.

示例C代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>

int main(int …
Run Code Online (Sandbox Code Playgroud)

java linux encoding file internationalization

6
推荐指数
2
解决办法
7335
查看次数