- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 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/
这个问题在这里已经有了答案: How to initialize var? (11 个答案) 关闭 8 年前。 我想给一个变量赋初值 null,并在下一个 if-else block 中赋值,但是编
我正在使用 TypeScript 3.8 编写 JS 和 TS 混合的代码。我写了以下行: export * as Easing from './easing'; 应该是 fair game在 Typ
我需要将 R 代码中的“/”更改为“\”。我有这样的事情: tmp <- paste(getwd(),"tmp.xls",sep="/") 所以我的 tmp是 c:/Study/tmp.xls 我希望
我有个问题。例如我有这个: id truth count 1 1 1 2 1 2 3 0 0 4 1 1 5 1 2 6 1
我正在尝试使用“IN”和“=”来查找一些 bean。我目前正在使用此代码: $ids = array(1,2,3,4); $user = 1; $things = R::find( 'thing'
是否可以在 Xcode 中部署到其他人的手机上?我没有 iPhone,但我想测试我在 friend 手机上制作的应用程序。在我支付 99 美元之前,我想确保这不会造成麻烦。 谢谢。 最佳答案 不会有任
我试图得到一个非常大的数字(超过 unsigned long long int )。所以我把它作为一个字符串,然后一个数字一个数字地转换成整数并使用它。 #include #include int
我在 Rust 中有 C 语言库的绑定(bind),但它们并不完整。 在 C 代码中,我定义了一个简化的宏,如下所示: #define MY_MACROS1(PTR) (((my_struct1
我正在努力解决这个问题。 http://jsfiddle.net/yhcqfy44/ 动画应该自动相对于 滚动到顶部每次出现滚动条时的高度。 我已经写了这个,但没有运气: var hheight =
我正在处理一个将数字作为字符串返回的 JSON API。例如 "12" ,但是,该字段值也可以是非数字的,例如:"-" . 我已将 JSON 数据解析为映射,我想将此字段提取为 elixir 中的整数
我正在尝试编写一个类,将.wav文件转换为.aiff文件作为项目的一部分。 我遇到了几个库Alvas.Audio(http://alvas.net/alvas.audio,overview.aspx)
我想在 Lucene 中将像“New York”这样的“复合词”索引为单个术语,而不是像“new”、“york”那样。这样,如果有人搜索“new place”,则包含“new york”的文档将不会匹
我希望这个解释能让我更好地了解使用宏的优点。 最佳答案 在函数中,所有参数在调用之前都会被评估。 这意味着 or 作为函数不能是惰性的,而宏可以将 or 重写为 if 语句,该语句仅在以下情况下计算分
我有一些看起来像这样的 XML foo ]]> (注意 > 登录 "> foo")和 XSLT 样式表 当我运行xsltproc stylesheet.xs
当我尝试将 Any 转换为 List 时,如下面的示例所示,我得到“Unchecked cast: Any!”到列表'警告。有没有解决此类问题的方法? val x: List = objectOfTy
我正在使用 Python 开发一个简单的爬虫。目的是创建一个 sitemap.xml。(你可以在这里找到真正的 alpha 版本:http://code.google.com/p/sitemappy/
我想知道在 VBScript 中是否可以在多行中中断 If 语句。喜欢: If (UCase(Trim(objSheet.Cells(i, a).Value)) = "YES") Or _ (UCas
for (String item : someList) { System.out.println(item); } 使用“do while”是否等效? 谢谢。 最佳答案 如果列表为空,f
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Split string with delimiters in C 在 C 中将“,”分隔的列表拆分为数组的最佳方法
我有一个如下所示的字符数组: [0, 10, 20, 30, 670] 如何将此字符串转换为整数数组? 这是我的数组 int i=0; size_t dim = 1; char* array = (c
我是一名优秀的程序员,十分优秀!