(JAVA) Как сопоставить строки, содержащие японские символы, для печати в терминале одинаковой длины - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь распечатать некоторые данные, включая имена с японскими символами и кандзи в табличном представлении в терминале.В другом проекте я нашел максимальное количество байтов в каждом столбце и добавил пробел для сопоставления номеров байтов для тех, у которых число байтов меньше максимального значения в столбце.На Windows-машине это работало нормально, однако, когда я снова пытаюсь реализовать это на своем Mac, это не работает.У меня есть следующие два вопроса:

  1. Кто-нибудь может дать какие-либо подсказки, почему это происходит?Это из-за разницы ОС?Или любая другая причина может вызвать это?(Не знаю, относится ли это к проблеме, но машина с Windows, на которой я работал, была на японском, а мой mac - на английском)

  2. Если это не сработает, есть ликакие-нибудь другие подходы, которые я могу использовать, чтобы решить это?лучше всего то, что один и тот же код может работать в обеих ОС.

Ниже приведен пример кода:

class test
{
    public static void main(String[] args)
    {
        String a = "sojdi";
        String b = "sじゃいおdw";
        while(a.getBytes().length<b.getBytes().length)
        {
            a = a+' ';
        }
        System.out.println("|"+a+"|");
        System.out.println("|"+b+"|");
        System.out.println("Bytes Number of a: " + a.getBytes().length);
        System.out.println("Bytes Number of b: " + b.getBytes().length);
    }
}

Результат: Bytes number matches but print out with different length

Количество байтов совпадает, но строки печатаются по-разному по длине.Любой совет или любой другой подход к решению этого?Заранее спасибо.

------------------------------------------------------------

Обновление:

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

Из-за разной кодировки число байтов для японских символов равно 3, а для алфавита / пробелов - 1, но ширина символа фактически равна 2 для японского языка, а для алфавита / пробелов - 1. Следовательно, каждый японский символ, который у меня естьсоздаст разницу в 2 байта вместо 1, что и должно быть, чтобы соответствовать ширине строки.Однако, когда я реализовал это в Windows ранее, это было 2 и 1 байт для японского языка и алфавита соответственно (я полагаю).Итак, как кто-то предложил, но удалил свой комментарий, я изменил свой код следующим образом:

class test
{
    public static void main(String[] args)
    {
        String a = "sojdi";
        String b = "s じゃいお青いdw";
        while(a.getBytes(Charset.forName("SHIFT-JIS")).length<b.getBytes(Charset.forName("SHIFT-JIS")).length)
        {
            a = a+' ';
        }
        System.out.println("|"+a+"|");
        System.out.println("|"+b+"|");
        System.out.println("Bytes Number of a: " + a.getBytes(Charset.forName("SHIFT-JIS")).length);
        System.out.println("Bytes Number of b: " + b.getBytes(Charset.forName("SHIFT-JIS")).length);
    }
}

И результат: result

...