encoding - 如何将 cp1251 字节数组转换为 utf8 字符串?

标签 encoding java-me utf-8 cp1251

我们在手机上没有可用的 cp1251 代码页,因此 new String( data, "cp1251") 工作。

我们需要一个带有类似签名的函数

String ArrayCp1251toUTF8String(byte data[]);

最佳答案

首先,Java 中没有“UTF-8 字符串”这样的东西,它们只是字符串。但是您不必担心字符串的编码,只需担心您正在转换的字节的编码。由于 cp1251(或 windows-1251)是单字节编码,解码是一个简单的事情,使用字节值作为索引到适当的 数组中字符 值。这是一个例子:

static String decodeCp1251(byte[] data)
{
  if (data == null)
  {
    throw new IllegalArgumentException("Null argument");
  }
  StringBuffer sb = new StringBuffer(data.length);
  for (int i = 0; i < data.length; i++)
  {
    sb.append(cp1251Map[data[i] & 0xFF]);
  }
  return sb.toString();
}

static char[] cp1251Map = new char[] {
  '\u0000', '\u0001', '\u0002', '\u0003', '\u0004', '\u0005', '\u0006', '\u0007',
  '\u0008', '\u0009', '\n', '\u000B', '\u000C', '\r', '\u000E', '\u000F',
  '\u0010', '\u0011', '\u0012', '\u0013', '\u0014', '\u0015', '\u0016', '\u0017',
  '\u0018', '\u0019', '\u001A', '\u001B', '\u001C', '\u001D', '\u001E', '\u001F',
  '\u0020', '\u0021', '\u0022', '\u0023', '\u0024', '\u0025', '\u0026', '\'',
  '\u0028', '\u0029', '\u002A', '\u002B', '\u002C', '\u002D', '\u002E', '\u002F',
  '\u0030', '\u0031', '\u0032', '\u0033', '\u0034', '\u0035', '\u0036', '\u0037',
  '\u0038', '\u0039', '\u003A', '\u003B', '\u003C', '\u003D', '\u003E', '\u003F',
  '\u0040', '\u0041', '\u0042', '\u0043', '\u0044', '\u0045', '\u0046', '\u0047',
  '\u0048', '\u0049', '\u004A', '\u004B', '\u004C', '\u004D', '\u004E', '\u004F',
  '\u0050', '\u0051', '\u0052', '\u0053', '\u0054', '\u0055', '\u0056', '\u0057',
  '\u0058', '\u0059', '\u005A', '\u005B', '\\', '\u005D', '\u005E', '\u005F',
  '\u0060', '\u0061', '\u0062', '\u0063', '\u0064', '\u0065', '\u0066', '\u0067',
  '\u0068', '\u0069', '\u006A', '\u006B', '\u006C', '\u006D', '\u006E', '\u006F',
  '\u0070', '\u0071', '\u0072', '\u0073', '\u0074', '\u0075', '\u0076', '\u0077',
  '\u0078', '\u0079', '\u007A', '\u007B', '\u007C', '\u007D', '\u007E', '\u007F',
  '\u0402', '\u0403', '\u201A', '\u0453', '\u201E', '\u2026', '\u2020', '\u2021',
  '\u20AC', '\u2030', '\u0409', '\u2039', '\u040A', '\u040C', '\u040B', '\u040F',
  '\u0452', '\u2018', '\u2019', '\u201C', '\u201D', '\u2022', '\u2013', '\u2014',
  '\uFFFD', '\u2122', '\u0459', '\u203A', '\u045A', '\u045C', '\u045B', '\u045F',
  '\u00A0', '\u040E', '\u045E', '\u0408', '\u00A4', '\u0490', '\u00A6', '\u00A7',
  '\u0401', '\u00A9', '\u0404', '\u00AB', '\u00AC', '\u00AD', '\u00AE', '\u0407',
  '\u00B0', '\u00B1', '\u0406', '\u0456', '\u0491', '\u00B5', '\u00B6', '\u00B7',
  '\u0451', '\u2116', '\u0454', '\u00BB', '\u0458', '\u0405', '\u0455', '\u0457',
  '\u0410', '\u0411', '\u0412', '\u0413', '\u0414', '\u0415', '\u0416', '\u0417',
  '\u0418', '\u0419', '\u041A', '\u041B', '\u041C', '\u041D', '\u041E', '\u041F',
  '\u0420', '\u0421', '\u0422', '\u0423', '\u0424', '\u0425', '\u0426', '\u0427',
  '\u0428', '\u0429', '\u042A', '\u042B', '\u042C', '\u042D', '\u042E', '\u042F',
  '\u0430', '\u0431', '\u0432', '\u0433', '\u0434', '\u0435', '\u0436', '\u0437',
  '\u0438', '\u0439', '\u043A', '\u043B', '\u043C', '\u043D', '\u043E', '\u043F',
  '\u0440', '\u0441', '\u0442', '\u0443', '\u0444', '\u0445', '\u0446', '\u0447',
  '\u0448', '\u0449', '\u044A', '\u044B', '\u044C', '\u044D', '\u044E', '\u044F'
};

关于encoding - 如何将 cp1251 字节数组转换为 utf8 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2288490/

相关文章:

Python os.walk 支持 Unicode/UTF-8?

c# - 在测试中捕获控制台应用程序输出时的编码问题

perl - 检测单个 CJK 字符

java-me - 我如何开始使用 J2ME?

java - 变音符号的解码问题

.net - StreamReader.ReadToEnd()使用什么字符编码?

javascript - 在 Angular 中向具有不同重音的对象添加属性

blackberry - 如何在黑莓中读取.xls(ms excel)文件

java - HTTP 连接发送数据两次

php - 古吉拉特语字体显示有正方形和问号,如何删除这些特殊字符?