Where to get “UTF-8” string literal in Java?
我试图在这段代码中使用常量而不是字符串文字:
"UTF-8"经常出现在代码中,最好是引用一些static final变量。你知道在JDK中哪里可以找到这样的变量吗?
顺便说一句,这种常量的设计很糟糕:公共静态文本…不是重复数据的解决方案
- 看看这个问题。
- 注意:如果您已经在Java 7上,请使用NIO中的EDCOX1 OR 0。
在Java 1.7中,JavaNIO.CARSET.Stand ARTHARSET为EDCOX1 6定义了常数,包括EDCOX1×13。
1 2 3 4 5
| import java.nio.charset.StandardCharsets;
...
StandardCharsets.UTF_8.name(); |
Android版:Minsdk 19
- 您在上面使用.toString()吗?
- 我使用displayname()。
- .toString()可以工作,但正确的功能是.name()。99.9%的ToString不是答案。
- btw .displayName()也可以工作,除非它按预期的本地化被覆盖。
- 你根本不需要打电话给name()。您可以直接将Charset对象传递到InputStreamReader构造函数中。
- 请注意,在android中,这需要API级别19+。
- 还有其他的lib需要String,可能是因为遗留的原因。在这种情况下,我把一个Charset物体放在周围,通常是从StandardCharsets衍生出来的,如果需要的话,使用name()。
- name()、toString()和直接放入StandardCharsets.UTF-8的结果都是一样的,因为Charset.toString()只调用Charset.name(),如果在需要字符串的地方使用StandardCharsets.UTF-8会自动调用Charset.toString()。
现在我使用来自commons-lang的org.apache.commons.lang3.CharEncoding.UTF_8常量。
- 对于使用lang 3.0:org.apache.commons.lang3.CharEncoding.UTF_8的用户。(注"lang3")。
- 如果您使用Java 1.7,请参阅下面的"罗杰的答案",因为它是标准库的一部分。
- P.S."@Roger's answer below"现在是@Roger's answer above。?
不管怎样,我都极力推荐的谷歌番石榴库(如果您在Java中工作),有一个具有4到2个类的静态字段,如3。
由于Java 7,你应该只使用EDCOX1,5,而不是类似的常量。
注意,这些常量不是字符串,而是实际的Charset实例。所有采用字符集名称的标准API也都有一个重载,它采用一个Charset对象,您应该使用它来代替。
- 那么,应该是charset.utf_8.name()?
- @Kilaka是的,使用name()而不是getDisplayName(),因为name()是最终的,getDisplayName()不是
- 坏主意是使用不断修改的第三方代码,破坏向后兼容性,以完成您可以用标准SDK做的事情。
- @布法罗:请再次阅读我的答案:它建议尽可能使用java.nio.charset.StandardCharsets,这不是第三方代码。另外,guava字符集的定义没有"不断修改",afaik也没有破坏向后兼容性,所以我认为你的批评是没有必要的。
- 升级guava库时,我们遇到了多个问题。
- @布法罗:也许是这样,但我怀疑你的问题与Charsets课程有关。如果你想抱怨番石榴,那没关系,但这里不是抱怨的地方。
- 请不要包含多兆字节库以获取一个字符串常量。
- "所有采用charset名称的标准API也都有一个采用charset对象的重载"不是很正确。一个例子是java.net.URLEncoder.encode(String, String),它不具有采用Charset参数的重载。
如果这个页面出现在某人的Web搜索中,就像Java 1.7一样,现在可以使用java. NIO.CARSET.Stand ARTHARSET来访问标准字符集的常量定义。
- 我一直在试着用这个,但它似乎不起作用。"Java.Nio.CalSET.*"之后,似乎工作了,但是当我试图使用"文件.RealLayLead"时,我似乎不能明确地引用UTF8。
- @罗杰,怎么了?据我所见,你可以叫:Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);。
- 我不知道是什么问题,但在我改变了一些我不记得的事情之后,它对我起了作用。
- ^^^您可能需要在IDE中更改目标平台。如果1.6是您安装IDE时最新的JDK,它可能会选择它作为默认值,并在您更新了IDE和JDK之后很长时间将其保留为默认值。
没有(至少在标准Java库中)。字符集因平台而异,因此在Java中没有标准的列表。
但是,有些第三方库包含这些常量。其中之一是guava(Google核心库):http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/charsets.html
- 我花了一秒钟才明白…guava的字符集常量是(不足为奇)字符集,而不是字符串。inputStreamReader有另一个采用字符集而不是字符串的构造函数。如果您真的需要这个字符串,例如charsets.utf_8.name()。
- 字符集可能因平台而异,但可以保证存在UTF-8。
- EDCX1 0中定义的所有字符集都保证存在于每个平台上的每个Java实现中。
这个常数(除其他外,如:UTF-16、US-ASCII等)也可用于org.apache.commons.codec.CharEncoding类。
您可以使用Charset.defaultCharset()API或file.encoding属性。
但是如果你想要你自己的常数,你需要自己定义它。
- 默认的字符集通常是由OS和区域设置来确定的,我认为没有保证它对于多个Java调用仍然是相同的。因此,这并不能代替一个持续分离的"utf-8"。
用Java 1.7 +
不要使用"utf-8"字符串,而是使用Charset类型参数:
。
标准的常量定义。这些在Java的每一个实现中都可以保证字符集可用。平台。从1.7开始
1 2
| package java.nio.charset;
Charset utf8 = StandardCharsets.UTF_8; |
如果您使用OKHTTP用于Java/Android,您可以使用以下常量:
1 2 3 4
| import com.squareup.okhttp.internal.Util;
Util. UTF_8; // Charset
Util. UTF_8. name(); // String |
号
- 它已从OKHTTP中删除,所以下一种方法是:当您需要对低于API 19+的Android的支持时,使用Charset.forName("UTF-8").name(),否则可以使用:StandardCharsets.UTF_8.name()。