gpt4 book ai didi

java - 在Java中将韩语字符写入压缩的csv文件

转载 作者:行者123 更新时间:2023-12-02 03:59:41 25 4
gpt4 key购买 nike

我正在编写一个 csv 文件,我也需要对其进行压缩,并且正在使用 java.util.zip.ZipEntry 和 java.util.zip.ZipOutputStream。

当我在所有列中都有西方字符时,一切都很好,但是当我使用韩语字符时,它无法识别/n 并且所有内容都显得困惑并且位于同一行。我将其写为 UTF-8 字符,并期望这涵盖韩语。

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class CreateCSV {

public static void main(String[] args) throws IOException {

DateTime utcDateTime = new DateTime().toDateTime(DateTimeZone.UTC);
DateTime newDateTime = utcDateTime.toDateTime();
DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("yyyyMMdd-HHmmss-SSS-");
File zipFile = new File("C:/TestCSVKorean/"+ dateFormatter.print(newDateTime) + "Export.zip");

FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
// Open up the zipfile and create the csv entry
ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(fileOutputStream));
zos.putNextEntry(new ZipEntry(dateFormatter.print(newDateTime) + "tics.csv"));
// The first line of the CSV is a header line
StringBuffer csvHeader = new StringBuffer(
"Time,Name,Rev,Appme,EnvName,PlanName,PlanRev,"
+ "Og Name,Op Name,"
+ "TTR,Lat,Bys Rec,Bytt,"
+ "RPl,Request Method,URI Path,Query String,HTTP Status Code,"
+ "HTTP Request Headers,User Agent,Request Body,HTTP Response Headers,Response Body\n");
zos.write(csvHeader.toString().getBytes(), 0, csvHeader.length());

StringBuffer csvData = new StringBuffer("");

csvData.append("\"" + newDateTime + "\",\"" +
"apiName" + "\"," +
"2.0.0" + ",\"" +
"app name" + "\",\"" +
"env name" + "\",\"" +
"plan name" + "\"," +
"2" + ",\"" +
"dev org name" + "\",\"" +
"ìº˜ë¦°ë” ëª©ë¡ì¡°íšŒ(ë‚´ 캘린ë”, 구ë…가능한 캘린ë”, 시스템 캘린ë”, ê´€ë¦¬ìž ìº˜ë¦°ë”)" + "\"," +
"123" + "," +
"inifd: 334;dshs: 343" + ", " +
"10" + "," +
"33" + ",\"" +
"http" + "\",\"" +
"GET" + "\",\"" +
"/dsfs/sdf/ds" + "\",\"" + "query string" + "\",\"" +
"200" + "\",\"" +
"jshkshdf" + "\",\"" +
"sdjhfks/sdfs/" + "\",\"" +
"jhksdfhks dsfs" + "\",\"" +
"dsfsdfs" + "\",\"" +
"dsfsfs" + "\"\n");

zos.write(csvData.toString().getBytes("UTF-8"), 0, csvData.length());

csvData = new StringBuffer("");

csvData.append("\"" + newDateTime + "\",\"" +
"apiName" + "\"," +
"2.0.0" + ",\"" +
"app name" + "\",\"" +
"env name" + "\",\"" +
"plan name" + "\"," +
"2" + ",\"" +
"dev org name" + "\",\"" +
"ìº˜ë¦°ë” ëª©ë¡ì¡°íšŒ(ë‚´ 캘린ë”, 구ë…가능한 캘린ë”, 시스템 캘린ë”, ê´€ë¦¬ìž ìº˜ë¦°ë”)" + "\"," +
"123" + "," +
"inifd: 334;dshs: 343" + ", " +
"10" + "," +
"33" + ",\"" +
"http" + "\",\"" +
"GET" + "\",\"" +
"/dsfs/sdf/ds" + "\",\"" + "query string" + "\",\"" +
"200" + "\",\"" +
"jshkshdf" + "\",\"" +
"sdjhfks/sdfs/" + "\",\"" +
"jhksdfhks dsfs" + "\",\"" +
"dsfsdfs" + "\",\"" +
"dsfsfs" + "\"\n");


zos.write(csvData.toString().getBytes("UTF-8"), 0, csvData.length());

zos.close();

}

}

这是我打开 csv 文件时看到的内容:

时间名称 Rev Appme EnvName PlanName PlanRev Og Name Op Name TTR Lat Bys Rec Bytt RPl 请求方法 URI 路径查询字符串 HTTP 状态代码 HTTP 请求 header 用户代理请求正文 HTTP 响应 header 响应正文
2016-01-28T17:20:56.859Z apiName 2.0.0 应用程序名称 env 名称 计划名称 2 开发组织名称 ¡°Ëœâââ°âââââ € ¡ªª©¡¡¡¡¡° ��(��� ����������������������������������� �°���, ���“�����������������, ��������� Ø¡¡Ëœââ°ââ€) 123 inifd: 334;dshs: 343 10 33 http 2016-01-28T17:20:56.859Z apiName 2.0.0 应用程序名称 env 名称 计划名称 2 开发组织名称 ����������������������������������°������'(������ ������������°������, ����°���������������������, ���“�������� “”、“、”、“、”) 123 inifd: 334;dshs: 343 10 33 http

它将第二行中的日期字段粘贴到第一行的请求方法字段中:2016-01-28T17:20:56.859Z

最佳答案

首先,你应该改掉使用StringBuffer的习惯。这是一个过时的类。如果您需要一点一点地附加文本,通常会使用 StringBuilder相反。

但是,就您而言,您不需要 StringBuilder 或 StringBuffer。只需使用字符串:

String csvHeader =
"Time,Name,Rev,Appme,EnvName,PlanName,PlanRev,"
+ "Og Name,Op Name,"
+ "TTR,Lat,Bys Rec,Bytt,"
+ "RPl,Request Method,URI Path,Query String,HTTP Status Code,"
+ "HTTP Request Headers,User Agent,Request Body,HTTP Response Headers,Response Body\n";

还有……

String csvData = "\"" + newDateTime + "\",\"" +
"apiName" + "\"," +
"2.0.0" + ",\"" +
"app name" + "\",\"" +
// etc.

其次,请注意不要将字节数与字符数混淆。当您使用 UTF-8 字符集将字符串转换为字节时,任何不在 US-ASCII 范围 (0-127) 内的字符都将转换为多个字节。因此,字节数将大于 String 的长度(表示它包含多少个字符,而不是用 UTF-8 编码时占用多少字节)。

所以你的写操作应该是:

zos.write(csvData.toString().getBytes("UTF-8"));

第三,我不懂韩语,但我知道韩文字符是什么样的,但我在你的代码中没有看到任何字符。我假设您希望这些是韩文:

"ìº˜ë¦°ë” ëª©ë¡ì¡°íšŒ(ë‚´ 캘린ë”, 구ë…가능한 캘린ë”, 시스템 캘린ë”, ê´€ë¦¬ìž ìº˜ë¦°ë”)" + "\"," +

看来您正在使用 Windows 将每个单独的 UTF-8 字节放入字符串中,就好像它是一个字符一样。但在 Java 中,字节不是字符,并且不能与字符互换。

我假设你使用Windows,因为第三个字符,空格Unicode字符SMALL TILDE ,是\u02dc,通常会占用两个字节,但在windows-1252编码中,它是单字节0x98。

因此,如果我假设您从 Hangul 字符的 UTF-8 字节派生出这些字符,则上述字符串中的前六个字节为:

ec ba 98 eb a6 b0
ì º ˜ ë ¦ °

这些字节是两个韩文字符 U+CE98 和 U+B9B0 的 UTF-8 表示。将这两个字符放入 Java 字符串中的正确方法是:

"\uce98\ub9b0"

如果文件中有原始朝鲜文文本,则可以使用 native2ascii 轻松将整个文本转换为一系列 Java 转义序列,如上面的行。每个 JDK 附带的工具。这样的命令可能如下所示:

native2ascii -encoding UTF-8 hangul.txt hangulstrings.java

如果您不想正确编写字符串,我不推荐的另一种方法是通过识别来强制当前的“伪字节”字符串被解释为 UTF-8 字节它包含表示字节的 Windows-1252 字符并将其恢复为这些字节:

zos.write(csvData.getBytes("windows-1252"));

生成的 zip 条目仍将以 UTF-8 编码,因为您的字节是 Hangul 文本的 UTF-8 表示形式。因此,您需要确保使用可识别该文件为 UTF-8 的工具打开该文件。

Windows 不太擅长识别 UTF-8 文件。记事本在这方面尤其糟糕。向 Windows 表明文件是 UTF-8 文件的一种方法是将字节顺序标记字符写入文件中的第一个字符:

String csvHeader = "\ufeff"
+ "Time,Name,Rev,Appme,EnvName,PlanName,PlanRev,"
// etc.

关于java - 在Java中将韩语字符写入压缩的csv文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35068112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com