Создание файла UTF-8 в Java - PullRequest
       0

Создание файла UTF-8 в Java

1 голос
/ 14 ноября 2011

В настоящее время я делаю программу, которая сохраняет китайские слова в текстовый файл. Я создаю текстовый файл в Java, а затем пытаюсь написать слова для него. Тем не менее, текстовый файл, который я создаю, никогда не кодируется в UTF-8. Это код, который я использую, почему он не работает? Мне сказали, что в Java есть ошибка, но я не знаю, как ее обойти.

public void createFile(String name) {
    try {
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream(name +".txt"), "UTF-8"));
        out.write("");
    }
    catch(java.io.IOException e) {
        System.err.println("Something went wrong.");
    }
}

Кроме того, есть ли у меня другой вариант помимо текстовых файлов, с которым я все еще мог бы использовать кодировку UTF?

Также я проверяю его кодировку, открывая приложение TextEdit и пытаясь писать китайские символы. Может ли это быть проблемой?

Ответы [ 5 ]

1 голос
/ 14 ноября 2011

Это может быть проблема использования TextEdit.

Если в файле, который вы пишете, нет символов, отличных от ASCII, алгоритм TextEdit для определения кодировки, скорее всего, будет использовать ASCII или вариант Latin-1.

Вы можете указать кодировку текстового файла в диалоге Файл-> Открыть. Я не уверен, запомнит ли TextEdit это решение при двойном щелчке этого файла в будущем.

1 голос
/ 14 ноября 2011

Попробуйте следующий код.Это сработало для меня.Файл был записан как UTF-8.Я смог открыть его с помощью Notepad ++, который подтвердил, что кодировка UTF-8.Символы закодированы правильно.Я получил символы от http://www.khngai.com/chinese/charmap/tbluni.php.

package testutf8;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;

public class TestUTF8 {
  public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException, IOException {
    String str = "Unicode Character Map, 0x4E00 - 0x4FFF\n" +
                 "4E00   一   丁   丂   七   丄   丅   丆   万   丈   三   上   下   丌   不   与   丏\n" +
                 "4E10   丐   丑   丒   专   且   丕   世   丗   丘   丙   业   丛   东   丝   丞   丟\n" +
                 "4E20   丠   両   丢   丣   两   严   並   丧   丨   丩   个   丫   丬   中   丮   丯\n" +
                 "4E30   丰   丱   串   丳   临   丵   丶   丷   丸   丹   为   主   丼   丽   举   丿\n" +
                 "4E40   乀   乁   乂   乃   乄   久   乆   乇   么   义   乊   之   乌   乍   乎   乏\n" +
                 "4E50   乐   乑   乒   乓   乔   乕   乖   乗   乘   乙   乚   乛   乜   九   乞   也\n" +
                 "4E60   习   乡   乢   乣   乤   乥   书   乧   乨   乩   乪   乫   乬   乭   乮   乯\n" +
                 "4E70   买   乱   乲   乳   乴   乵   乶   乷   乸   乹   乺   乻   乼   乽   乾   乿\n" +
                 "4E80   亀   亁   亂   亃   亄   亅   了   亇   予   争   亊   事   二   亍   于   亏\n" +
                 "4E90   亐   云   互   亓   五   井   亖   亗   亘   亙   亚   些   亜   亝   亞   亟\n" +
                 "4EA0   亠   亡   亢   亣   交   亥   亦   产   亨   亩   亪   享   京   亭   亮   亯\n" +
                 "4EB0   亰   亱   亲   亳   亴   亵   亶   亷   亸   亹   人   亻   亼   亽   亾   亿\n" +
                 "4EC0   什   仁   仂   仃   仄   仅   仆   仇   仈   仉   今   介   仌   仍   从   仏\n" +
                 "4ED0   仐   仑   仒   仓   仔   仕   他   仗   付   仙   仚   仛   仜   仝   仞   仟\n" +
                 "4EE0   仠   仡   仢   代   令   以   仦   仧   仨   仩   仪   仫   们   仭   仮   仯\n" +
                 "4EF0   仰   仱   仲   仳   仴   仵   件   价   仸   仹   仺   任   仼   份   仾   仿\n" +
                 "4F00   伀   企   伂   伃   伄   伅   伆   伇   伈   伉   伊   伋   伌   伍   伎   伏\n" +
                 "4F10   伐   休   伒   伓   伔   伕   伖   众   优   伙   会   伛   伜   伝   伞   伟\n" +
                 "4F20   传   伡   伢   伣   伤   伥   伦   伧   伨   伩   伪   伫   伬   伭   伮   伯\n" +
                 "4F30   估   伱   伲   伳   伴   伵   伶   伷   伸   伹   伺   伻   似   伽   伾   伿\n" +
                 "4F40   佀   佁   佂   佃   佄   佅   但   佇   佈   佉   佊   佋   佌   位   低   住\n" +
                 "4F50   佐   佑   佒   体   佔   何   佖   佗   佘   余   佚   佛   作   佝   佞   佟\n" +
                 "4F60   你   佡   佢   佣   佤   佥   佦   佧   佨   佩   佪   佫   佬   佭   佮   佯\n" +
                 "4F70   佰   佱   佲   佳   佴   併   佶   佷   佸   佹   佺   佻   佼   佽   佾   使\n" +
                 "4F80   侀   侁   侂   侃   侄   侅   來   侇   侈   侉   侊   例   侌   侍   侎   侏\n" +
                 "4F90   侐   侑   侒   侓   侔   侕   侖   侗   侘   侙   侚   供   侜   依   侞   侟\n" +
                 "4FA0   侠   価   侢   侣   侤   侥   侦   侧   侨   侩   侪   侫   侬   侭   侮   侯\n" +
                 "4FB0   侰   侱   侲   侳   侴   侵   侶   侷   侸   侹   侺   侻   侼   侽   侾   便\n" +
                 "4FC0   俀   俁   係   促   俄   俅   俆   俇   俈   俉   俊   俋   俌   俍   俎   俏\n" +
                 "4FD0   俐   俑   俒   俓   俔   俕   俖   俗   俘   俙   俚   俛   俜   保   俞   俟\n" +
                 "4FE0   俠   信   俢   俣   俤   俥   俦   俧   俨   俩   俪   俫   俬   俭   修   俯\n" +
                 "4FF0   俰   俱   俲   俳   俴   俵   俶   俷   俸   俹   俺   俻   俼   俽   俾   俿\n";

    FileOutputStream fos = new FileOutputStream("tmp.txt");
    Writer           out = new OutputStreamWriter(fos, "UTF-8");
    out.write(str);
    out.close();
  }
}

1 голос
/ 14 ноября 2011

Во-первых, сами файлы не имеют кодировок.Они куча 0 и 1.Если вы напишите «asdf» в utf-8, это будет совершенно неотличимо от простого старого ascii7.

Если бы вы писали, скажем, в utf-16, то метка порядка байтов (BOM) была бы довольно четким признаком того, что она написана в utf-16, даже с пустой строкой, но utf-8 не требует наличия такого маркера.

Следовательно, ваш редактор не может знать, что этот файл должен быть записан в utf-8.Вы можете записать спецификацию utf-8 в свой файл следующим образом:

out.write (0xEFBBBF);

Однако в этом случае out должен быть OutputStream, напримерFileOutputStream.(BufferedWriter и OutputStreamWriter не принимают байтовые массивы для ввода.)

0 голосов
/ 14 ноября 2011

Я заметил, что вы не закрыли свой поток:

out.close();

Конечно, вы также не включили код, который написал реальные символы ...

0 голосов
/ 14 ноября 2011

Попробуйте UTF-8 вместо UTF8.Это может решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...