客户端打印标签并一直使用一组符号 (?) 字体来执行此操作。该应用程序使用单字节数据库(Oracle with Latin-1)。我要替换的旧应用程序不支持 Unicode。它以某种方式做得很好。我正在编写的替换应用程序应该处理旧数据。
从charmap 应用程序中挑选的符号通常映射到特定的Unicode 字符,但有时它们不会。例如,使用 LAB3 字体看起来像月亮的东西实际上是 U+2014 (EM DASH)。当用户将此字符粘贴到 Swing 文本字段中时,该字符的代码点为 8212。它被“移动”到私人使用区域(Windows?Java?)。当将此字符保存到数据库时,Oracle 认为它不能被安全地编码并用可怕的 ¿ 代替它。因此,我开始将字符移动 8000:保存时 -= 8000,显示字段时 += 8000。不幸的是,我发现其他字符没有移动相同的数量。例如,在一种特定的字体中,ž 的代码点为 382,因此我将其移动了 +/-256 以“修复”它。
到现在为止,我害怕发现更多奇怪的偏移量,我想知道:我可以使用 Java 进行这种映射吗?也许 TTF 字体有一个它编码的 255 个字形的列表以及它们对应的 Unicode 字符,我可以“正确”地做到这一点?
现在我正在使用以下kludge:
static String fromDatabase(String str, String fontFamily) {
if (str != null && fontFamily != null) {
Font font = new Font(fontFamily, Font.PLAIN, 1);
boolean changed = false;
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (font.canDisplay(chars[i] + 0xF000)) {
// WE8MSWIN1252 + WinXP
chars[i] += 0xF000;
changed = true;
}
else if (chars[i] >= 128 && font.canDisplay(chars[i] + 8000)) {
// WE8ISO8859P1 + WinXP
chars[i] += 8000;
changed = true;
}
else if (font.canDisplay(chars[i] + 256)) {
// ž in LAB1 Eastern = 382
chars[i] += 256;
changed = true;
}
}
if (changed) str = new String(chars);
}
return str;
}
static String toDatabase(String str, String fontFamily) {
if (str != null && fontFamily != null) {
boolean changed = false;
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
int chr = chars[i];
if (chars[i] > 0xF000) {
// WE8MSWIN1252 + WinXP
chars[i] -= 0xF000;
changed = true;
}
else if (chars[i] > 8000) {
// WE8ISO8859P1 + WinXP
chars[i] = (char) (chars[i] - 8000);
changed = true;
}
else if (chars[i] > 256) {
// ž in LAB1 Eastern = 382
chars[i] = (char) (chars[i] - 256);
changed = true;
}
}
if (changed) return new String(chars);
}
return str;
}