在Java中将字符串编码从UTF-8更改为windows-1251时保存西里尔文[已关闭]

slmsl1lt  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(391)

**已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。

这个问题似乎与help center中定义的范围内的编程无关。
昨天关门了。
Improve this question
我试着把UTF-8的编码转换成windows-1251的编码,但是我的解决方案都只适用于拉丁字母。所以我想把编码改成西里尔字符串。我该怎么做才能正确呢?
所有从bytes创建新String的解决方案都不保存Cyrillic字母。
例如:UTF-8 -一些找快快快快快快快快快快快快快快快快快快快和拉丁文窗口-1251 -一些

iecba09b

iecba09b1#

指定写入的字符编码

可以使用CharSet类指定字符编码。
现代Java中的NIO.2框架使得将文本写入文件变得很容易,例如Files.writeString
这个代码对我有效:

String original = "Some текст с кириллицей";
byte[] win1251Bytes = new byte[ 0 ];
try { win1251Bytes = original.getBytes( "windows-1251" ); } catch ( UnsupportedEncodingException e ) { throw new RuntimeException( e ); }
Path path = Paths.get( "/Users/whatever/bogus.txt" );  // Home folder on macOS.
try { Files.write( path , win1251Bytes ); } catch ( IOException e ) { throw new RuntimeException( e ); }

或者,根据下面Holger的评论,这个简短的代码也可以工作。

try
{
    Files.writeString(
            Paths.get( "/Users/whatever/bogus.txt" ) ,
            "Some текст с кириллицей" ,
            Charset.forName( "windows-1251" ) 
    );
}
catch ( IOException e )
{
    throw new RuntimeException( e );
}

我对西里尔文一无所知。我只是先读了Oracle tutorial。然后我在Baeldung.com上读了Writing byte[] to a File in Java页面。在Charset的Javadoc中,我发现了一个提到,如果Java支持一个字符集,我们应该能够使用IANA Charset Registry中列出的名称。通过该链接,我找到了名称"windows-1251"
运行该代码以创建文件。

指定读取的字符编码

在您选择的text editor中打开文件。确保告诉应用将文件中的octets解释为Windows-1251编码。👉interpret the octets in the file as Windows-1251encoding.
这里我选择使用苹果的TextEdit应用程序,它与macOS捆绑在一起。在文本编辑的文件〉打开对话框中,注意Options按钮用于显示字符编码列表。选择 * 西里尔(Windows)*,因为它似乎意味着Windows-1251

如果文本被正确地解释,我们会看到原始的西里尔字符。

默认值

请注意,在Java 17及更早版本之前,大多数情况下,Java运行时默认使用主机OS的原生字符编码。此默认设置适用于写入和读取文本文件等。
从Java 18及更高版本开始,大多数情况下Java运行时**默认使用UTF-8**字符编码。此默认设置适用于所有主机平台(macOS、Linux、Windows等)。请参阅JEP 400: UTF-8 by Default
因此,当您需要替代字符编码(如 * Windows 1251 *)时,始终显式指定CharSet

相关问题