4

我使用 Java 和 Log4j ..

我想用德语特殊字符记录一个字符串,例如 Ü Ä ä 等。但在我的 LogFile 中它看起来像这样:

<E4><FC><F6>

log4j.properties

log4j.rootLogger = ALL, rollingFile

log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.File=/home/tomcat/logs/debug.log 
log4j.appender.rollingFile.MaxFileSize=10MB
log4j.appender.rollingFile.MaxBackupIndex=2
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=%d %p %c - %m%n
log4j.appender.rollingFile.encoding=UTF-8
4

2 回答 2

1

您应该尝试使用以下代码以 unicode 格式存储和检索值

import java.io.UnsupportedEncodingException;

public class Test {

  public static void printBytes(byte[] array, String name) {
    for (int k = 0; k < array.length; k++) {
      System.out.println(name + "[" + k + "] = " + "0x"
          + UnicodeFormatter.byteToHex(array[k]));
    }
  }

  public static void main(String[] args) {

    System.out.println(System.getProperty("file.encoding"));
    String original = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C");

    System.out.println("original = " + original);
    System.out.println();

    try {
      byte[] utf8Bytes = original.getBytes("UTF8");
      byte[] defaultBytes = original.getBytes();

      String roundTrip = new String(utf8Bytes, "UTF8");
      System.out.println("roundTrip = " + roundTrip);

      System.out.println();
      printBytes(utf8Bytes, "utf8Bytes");
      System.out.println();
      printBytes(defaultBytes, "defaultBytes");
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }

  } // main

}

class UnicodeFormatter {

  static public String byteToHex(byte b) {
    // Returns hex String representation of byte b
    char hexDigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
        'a', 'b', 'c', 'd', 'e', 'f' };
    char[] array = { hexDigit[(b >> 4) & 0x0f], hexDigit[b & 0x0f] };
    return new String(array);
  }

  static public String charToHex(char c) {
    // Returns hex String representation of char c
    byte hi = (byte) (c >>> 8);
    byte lo = (byte) (c & 0xff);
    return byteToHex(hi) + byteToHex(lo);
  }

}

输出

Cp1252
original = AêñüC

roundTrip = AêñüC

utf8Bytes[0] = 0x41
utf8Bytes[1] = 0xc3
utf8Bytes[2] = 0xaa
utf8Bytes[3] = 0xc3
utf8Bytes[4] = 0xb1
utf8Bytes[5] = 0xc3
utf8Bytes[6] = 0xbc
utf8Bytes[7] = 0x43

defaultBytes[0] = 0x41
defaultBytes[1] = 0xea
defaultBytes[2] = 0xf1
defaultBytes[3] = 0xfc
defaultBytes[4] = 0x43
于 2012-11-13T10:11:50.790 回答
1

根据有关使用 Log4J 编码的最多发布问题,似乎没有任何已知问题,因此我假设您在打开文件时使用了错误的编码,请尝试检查编辑器和系统编码,您可能会发现有问题。

于 2012-11-13T10:31:13.743 回答