【发布时间】:2012-09-29 23:21:41
【问题描述】:
客户端打印标签并一直使用一组符号 (?) 字体来执行此操作。该应用程序使用单字节数据库(Oracle with Latin-1)。我要替换的旧应用程序不支持 Unicode。它以某种方式做得很好。我正在编写的替换应用程序应该处理旧数据。
从charmap 应用程序中挑选的符号通常映射到特定的Unicode 字符,但有时它们不会。例如,使用 LAB3 字体看起来像月亮的东西实际上是 U+2014 (EM DASH)。当用户将此字符粘贴到 Swing 文本字段时,该字符的代码点为 8212。它被“移动”到私人使用区域(Windows?Java?)。将此字符保存到数据库,甲骨文认为它不能被安全地编码,并用可怕的¿代替它。因此,我开始将字符移动 8000:保存时 -= 8000,显示字段时 += 8000。不幸的是,我发现其他字符没有移动相同的数量。例如,在一种特定字体中,ž 的代码点为 382,因此我将其移动了 +/-256 以“修复”它。
现在我害怕发现更多奇怪的偏移量,我想知道:我可以使用 Java 进行此映射吗?也许 TTF 字体有一个它编码的 255 个字形的列表,以及什么那些对应的Unicode字符,我可以“正确”吗?
现在我正在使用以下组件:
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;
}
【问题讨论】:
-
您使用的是什么字体,是 Windows 默认字体还是其他常用字体?
U+2014=8212因为2014是十六进制,所以代码点没有移动。 -
这些字体似乎是为客户定制设计的,名称如“LAB1 Western”、“LAB2 Cyrillic”和“LAB3 Baltish”等。
-
我将编辑问题并删除关于“移动”的部分——我将两个问题混为一谈(当我的数据库使用 WE8MSWIN1252 而不是 WE8ISO8859P1 时,我的字符在 0XF000 范围内,剩余的您仍然可以在代码中看到)。
-
我有两个问题:1) 数据库字符集是 Unicode 还是一些 1 字节的风格? 2) 您是否尝试将 swing/java 设置为与 DB 完全相同的字符集?
-
数据库现在使用 WE8ISO8859P1 (Latin 1)。我没有将 Swing/Java 设置为相同的字符集。我该怎么做?我认为 Java 在内部使用 Unicode 和 UTF-16 编码?
标签: java windows oracle swing fonts