如何遍历java.nio.charset.StandardCharsets中的所有Charset?
遍历StandardCharsets中所有字符集的正确方式
问题描述
我正在编写一个Java测试类,想要遍历StandardCharsets类中定义的所有Charset,并用每种编码对myString变量执行.getBytes()方法。
我尝试了如下代码:
String myString = "Some Junk"; for (Charset encoding : StandardCharsets) { System.out.println("Using Encoding: " + encoding.displayName()); byte[] newBytes = myString.getBytes(encoding); for (byte b : newBytes ) { System.out.print(b + " "); } System.out.println(""); }
显然这段代码不正确。除了手动逐个处理外,我该如何遍历StandardCharsets类中定义的所有Charset?
解决方案
StandardCharsets类中的字符集均为静态常量,无法直接像集合那样遍历,推荐两种实现方式:
方式一:通过反射自动获取所有静态字符集
利用反射读取StandardCharsets类的所有静态字段,筛选出Charset类型的实例,无需手动维护字符集列表:
import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class CharsetTest { public static void main(String[] args) { String myString = "Some Junk"; // 获取类的所有字段 Field[] fields = StandardCharsets.class.getDeclaredFields(); for (Field field : fields) { // 筛选静态且类型为Charset的字段 if (Modifier.isStatic(field.getModifiers()) && field.getType() == Charset.class) { try { Charset encoding = (Charset) field.get(null); System.out.println("Using Encoding: " + encoding.displayName()); byte[] newBytes = myString.getBytes(encoding); for (byte b : newBytes) { System.out.print(b + " "); } System.out.println(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } }
方式二:手动构建字符集列表(无反射)
如果不想使用反射,可以手动将StandardCharsets中定义的所有常量存入List后遍历,这种方式更直观,避免反射的潜在问题:
import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.List; public class CharsetTest { public static void main(String[] args) { String myString = "Some Junk"; List<Charset> standardCharsets = List.of( StandardCharsets.UTF_8, StandardCharsets.UTF_16, StandardCharsets.UTF_16BE, StandardCharsets.UTF_16LE, StandardCharsets.ISO_8859_1, StandardCharsets.US_ASCII ); for (Charset encoding : standardCharsets) { System.out.println("Using Encoding: " + encoding.displayName()); byte[] newBytes = myString.getBytes(encoding); for (byte b : newBytes) { System.out.print(b + " "); } System.out.println(); } } }
内容的提问来源于stack exchange,提问作者AcidHawk
相关产品推荐
相关产品推荐

