Java - преобразование из Unicode в ANSI - PullRequest
1 голос
/ 30 октября 2011

У меня есть строка \u0986\u09AE\u09BF \u0995\u09BF\u0982\u09AC\u09A6\u09A8\u09CD\u09A4\u09BF\u09B0 \u0995\u09A5\u09BE \u09AC\u09B2\u099B\u09BF. Мне нужно преобразовать его в Avwg wKse wš — i K_v ejwQ` в формате ANSI. Как я могу преобразовать этот Unicode в символы ANSI в Java.

Edit:

resultView.setTypeface(typeFace);
String str=new String("\u0986\u09AE\u09BF \u0995\u09BF\u0982\u09AC\u09A6\u09A8\u09CD\u09A4\u09BF\u09B0 \u0995\u09A5\u09BE \u09AC\u09B2\u099B\u09BF");               
resultView.setText(str);

Ответы [ 3 ]

6 голосов
/ 30 октября 2011

Мне нужно преобразовать его в AvwgwKsewš—i K_v ejwQ в формате ANSI.

Это не формат ANSI. Все кодовые страницы ANSI (с обманчивым названием) в Windows основаны на ASCII, в верхних байтах добавлены различные символы. Байт 0x41 (A) как начальная буква в кодовой странице ANSI всегда означает латинский A, а не бенгальский .

Я думаю, что у вас есть собственный шрифт символов, который отображает произвольные символы в совершенно не связанные кодовые точки. Каждый такой шрифт имеет свою визуальную кодировку; для преобразования между Юникодом и пользовательской визуальной кодировкой вам необходимо создать собственную таблицу перевода, посмотрев на глифы для каждого символа и сопоставив их с символом Юникод, который представляет одну и ту же букву.

Я бы настоятельно рекомендовал получить правильный шрифт, поддерживающий Unicode, который поддерживает вместо этого бенгальский. С контентом, застрявшим в произвольной кодировке, специфичной для шрифта, трудно иметь дело (поскольку семантически вы действительно имеете дело со строкой, которая означает «AvwgwKsewš — i K_v ejwQ», со всеми ошибками редактирования и изменения регистра, которые подразумевают.

Визуальные кодированные шрифты - это несчастливая реликвия того времени, когда в Windows была хорошая поддержка Юникода (или даже ISCII). Они не должны использоваться ни для чего сегодня.

1 голос
/ 30 октября 2011

Я не уверен, что именно вы спрашиваете, но я предполагаю, что вы спрашиваете, как преобразовать некоторые символы из Unicode в 8-битный набор символов.(например, ISO-8859-1 - это набор символов для западноевропейских языков, таких как английский).

Я не знаю ни одного способа автоматического определения соответствующей 8-битной кодировки, поэтому я посмотрел однуваших персонажей (здесь http://unicode.org/charts/), и я вижу, что эти персонажи бенгальцы.

Я думаю эквивалентный 8-битный набор символов для бенгали известен как x-iscii-be. У меня не установлено это в моей системе, поэтому я не смог успешно выполнить преобразование.

РЕДАКТИРОВАТЬ: Java не поддерживает кодировку x-iscii-be, но яоставлю оставшуюся часть этого ответа в целях иллюстрации.Список поддерживаемых кодировок см. В http://download.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html.

EDIT2: Android, безусловно, не гарантирует поддержку этой кодировки (единственная 8-битная кодировка, которую он гарантирует, это ISO-8859-1).См .: http://developer.android.com/reference/java/nio/charset/Charset.html.

* Итак, я думаю, вам следует запустить некоторый код, определяющий кодировку, на бенгальском устройстве Android - возможно, он поддерживает эту кодировку.Все, что вам нужно, в моем примере кода.*

Чтобы Java могла преобразовать ваши данные в другой набор символов, все, что вам нужно сделать в Java, - это проверить, установлен ли нужный набор символов, а затем указать нужный набор символов при преобразованииСтрока в байтах.

Само преобразование было бы чрезвычайно простым:

    str.getBytes("x-iscii-be");

Итак, вы видите, что сама строка хранится в своего рода «нормализованной» форме (то есть defaultCharset), и вы можететрактовать getBytes (charsetName) как «альтернативный формат вывода» для String. Извините - плохое объяснение!

В вашей ситуации, возможно, вам просто нужно назначить Charset для resultView, и фреймворк сработает для вас ...

Вот некоторый тестовый код, который я собрал, чтобы проиллюстрировать эту мысль и проверить, поддерживается ли данный набор символов в системе.

У меня есть этот код для вывода байтовых массивов в виде шестнадцатеричных строк, поэтомучто вы можете видеть, что после преобразования данные различаются.

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.util.Map.Entry;
import java.util.SortedMap;

public class UnicodeTest {
    public static void main(String[] args) throws UnsupportedEncodingException {
        testWestern();
        testBengali();
    }

    public static void testWestern() throws UnsupportedEncodingException {
        String unicodeStr= "\u00c2"; //This is a capital A with an accent.;
        String charsetName= "ISO-8859-1";
        System.out.println("Input (outputted as default charset - normally unicode): "+unicodeStr);
        attempt8bitCharsetConversion(unicodeStr, charsetName);
    }

    public static void testBengali() throws UnsupportedEncodingException {
        String unicodeStr = "\u0986\u09AE\u09BF \u0995\u09BF\u0982\u09AC\u09A6\u09A8\u09CD\u09A4\u09BF\u09B0 \u0995\u09A5\u09BE \u09AC\u09B2\u099B\u09BF";
        String charsetName= "x-iscii-be";
        System.out.println(unicodeStr);
        attempt8bitCharsetConversion(unicodeStr, charsetName);
    }

    public static void attempt8bitCharsetConversion(String input, String charsetName) throws UnsupportedEncodingException {
        SortedMap<String, Charset> availableCharsets = Charset
                .availableCharsets();
        for (Entry<String, Charset> entry : availableCharsets.entrySet()) {
            if (charsetName.equalsIgnoreCase(entry.getKey())) {
                System.out.println("HEXED input : "+ toHex(input.getBytes(Charset.defaultCharset().name())));
                System.out.println("HEXED output: "+ toHex(input.getBytes(entry.getKey())));
            }
        }
        throw new UnsupportedEncodingException(charsetName+ " is not supported on this system");
    }

    public static String toHex(byte[] input) throws UnsupportedEncodingException {
        return String.format("%x", new BigInteger(input));
    }
}

См. также здесь для получения дополнительной информации о преобразовании кодировки: http://download.oracle.com/javase/tutorial/i18n/text/string.html

Наборы символов - сложное дело, поэтому, пожалуйста, прости мойзамысловатый ответ.

HTH

0 голосов
/ 09 февраля 2012

Я написал класс, который может решить проблему 09CB ো, 09CC ৌ, 09C7 ে, 09C8 ৈ, 09 BF ি ্য, ্র, ৃ в UTF-8, я изменил его, отредактировав глиф шрифта, а вы нет Мне не нужно менять его на расширенный ASCII :(, но я не смог решить ваши бенгальские конъюгаты. Для правильного рендеринга требуется Android 3.5 или выше, он будет работать гладко на Android 4.0 (Ice Cream Sandwich).

...