客戶端打印標籤並使用一組符號(?)字體來執行此操作。該應用程序使用單字節數據庫(Oracle with Latin-1)。我正在替換的舊應用程序不支持Unicode。它以某種方式確定。我正在編寫的替換應用程序應該處理舊數據。如何根據使用的字體將代碼點映射到unicode字符?
從charmap應用程序中挑選的符號通常映射到特定的Unicode字符,但有時它們不會。例如,使用LAB3字體的月亮看起來像U + 2014(EM DASH)。當用戶將此字符粘貼到Swing文本字段中時,該字符的代碼點爲8212.
它被「移動」到專用區(由Windows?Java?提供)。
當把這個字符保存到數據庫時,Oracle決定它不能被安全地編碼並用可怕的¿代替它。因此,我開始將字符移動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範圍內的字符,在代碼中仍然可以看到其餘部分)。 –