C#读取java的Properties文件

本文介绍Java中如何处理Unicode与ASCII编码之间的转换,特别是在处理基于ASCII的属性文件时的常见问题及解决方案。通过实例展示了如何读取包含Unicode转义序列的文件,并将其正确解析为Unicode字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java从一个byte流中读取一个字符串时,将把平台相关的byte转变为平台无关的Unicode字符串。在输出时Java将把Unicode字符串转变为平台相关的byte流,如果某个Unicode字符在某个平台上不存在,将会输出一个′?′。举个例子:在日文Windows中,Java读出一个"SHIFT_JIS"编码的文件(可以是任何流)到内存中构造字符串对象,将会把"SHIFT_JIS"编码的文字转变为Unicode编码的字符串,如果把这个字符串输出又将会把Unicode字符串转化为"SHIFT_JIS"的byte流或数组:"新規作成"----->"/u65b0/u898f/u4f5c/u6210"----->"新規作成"。 由于Java 2 只能处理基于ASCII的属性文件,所以所有Unicode编码文件都要转换一下,使用ASCII转义代码。举个例子,用Notepad, EmEdit或者是Editplus打开properties文件,你将看到的都是一堆ASCII转义字符串:

# -- application --
msg.common.complete.process={0}/u304C/u5B8C/u4E86/u3057/u307E/u3057/u305F/u3002

用StreamReader, 无论是用什么编码来读取该文件,你获取到的都是那些像密码一样的东东。

再来看看下面两个语句的比较:

Console.WriteLine("1>>{0}", @"errors.token=/u753b/u9762/u8868/u793a/u9806/u304c/u4e0d/u6b63/u3067/u3059/u3002");

Console.WriteLine("2>>{0}", "errors.token=/u753b/u9762/u8868/u793a/u9806/u304c/u4e0d/u6b63/u3067/u3059/u3002");

输出结果:

1>> errors.token=/u753b/u9762/u8868/u793a/u9806/u304c/u4e0d/u6b63/u3067/u3059/u3002
2>> errors.token=画面表示順が不正です。

也就是从文件里读取出时,都如同输出1一样,无论你用什么编码。。。

因此我们要做的事就是,如何把 “/u753b”字符串 变成一个“画”字, 看上去像是在破译密码。日文环境下,日文汉字是双字节编码,由高低两个byte组合成。

[STAThread]

static void Main(string[] args)

{

string strFileName = "E://Visual Studio Project//MessageResources.properties";

Console.WriteLine(GetPropertiesText(strFileName));

Console.Read();

}

public static string GetPropertiesText(string strFileName)

{

StringBuilder sb = new StringBuilder();

using(StreamReader sr = new StreamReader(strFileName))

{

string str = null;

while ((str = sr.ReadLine()) != null)

{

Regex regex = new Regex("(////u[A-Fa-f0-9]{4})");

if(regex.IsMatch(str))

{

foreach(Match m in regex.Matches(str))

{

str = str.Replace(m.Result("$1"), GetUnicodeString(m.Result("$1").Replace("//u", "")));

}

sb.Append(str);

}

else

{

sb.Append(str);

}

sb.Append("/n");

}

}

return sb.ToString();

}

public static string GetUnicodeString(string strInput)

{

try

{

byte[] array = new byte[2];

string str = strInput;

string s1 = str.Substring(0, 2);

string s2 = str.Substring(2);

array[0] = Convert.ToByte(s1, 16);

array[1] = Convert.ToByte(s2, 16);

return System.Text.Encoding.BigEndianUnicode.GetString(array);

}

catch(Exception)

{

return strInput;

}

}

<!--EndFragment-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值