- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的应用程序默认编码设置为“UTF-8”(在启动时使用 -Dfile.encoding=UTF-8)。当我将 String 类方法“getBytes(String charsetName)”与 charset="ISO-8859-1"一起使用时,StringCoding.encode 似乎最终使用了默认字符集 (UTF-8) 而不是给定的 (ISO-8859-1)。
由于未知原因,我可以在此方法上逐步调试,但无法检查内部元素值(仅名为 arg0、arg1 ... 的参数)
在 java 1.6.10 中,StringCoding.encode 是这样写的:
static byte[] encode(String charsetName, char[] ca, int off, int len)
throws UnsupportedEncodingException
{
StringEncoder se = (StringEncoder)deref(encoder);
String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;
if ((se == null) || !(csn.equals(se.requestedCharsetName())
|| csn.equals(se.charsetName()))) {
se = null;
try {
Charset cs = lookupCharset(csn);
if (cs != null)
se = new StringEncoder(cs, csn);
} catch (IllegalCharsetNameException x) {}
if (se == null)
throw new UnsupportedEncodingException (csn);
set(encoder, se);
}
return se.encode(ca, off, len);
}
通过逐步调试,我从未进入 if block ,然后没有创建带有我的 ISO-8859-1 字符集的新 StringEncoder。最后调用 Charset.defaultCharset() 方法。
有什么线索吗?谢谢
最佳答案
如果你没有进入 if
block ,那么这个表达式一定是假的
(se == null) || !(csn.equals(se.requestedCharsetName())
|| csn.equals(se.charsetName()))
这意味着:
se
不能为空!
之前,第二部分必须为 true
,因此这些子表达式之一必须为 true:
csn.equals(se.requestedCharsetName())
csn.equals(se.charsetName())
换句话说,se
已经适合您请求的字符集名称。
这不是使用 VM 的“默认”编码;它正在使用上次在此线程中使用的编码器。
我非常怀疑您是否发现了 JRE 错误 - 我觉得它没问题。那么,是什么原因导致您开始对此进行调试呢?你能提供一个简短但完整的程序来演示使用它时的一个错误吗?某些编码错误的字节?
关于java - 为什么 java.lang.StringEncoding.encode 忽略给定的字符集以使用默认字符集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6409776/
我是 Netty 新手,到目前为止,有一个工作客户端服务器可以使用 StringEncoder 和 StringDecoder 处理字符串消息,例如: ServerBootstrap
下面基于字符串的服务器在功能上等同于它的数据报服务器兄弟吗? 我看到的唯一显着差异,也是我试图实现的唯一差异,是从 NioDatagramChannel 到 nioServerSocketChanne
我正在使用 Netty 开发 TCP 服务器。我知道通常的用法是创建一个 ServerBootstrap 并将 Initializer 对象传递给 childHandler() 方法。在 Initia
我的应用程序默认编码设置为“UTF-8”(在启动时使用 -Dfile.encoding=UTF-8)。当我将 String 类方法“getBytes(String charsetName)”与 cha
我是一名优秀的程序员,十分优秀!