gpt4 book ai didi

Java文件编码魔法

转载 作者:行者123 更新时间:2023-11-30 03:30:09 24 4
gpt4 key购买 nike

java 王国发生了奇怪的事情......
长话短说:我使用 Java API V3 连接到 QuickBooks 并从中获取数据形式(例如服务)。
一切都很顺利,除了服务包含俄语符号(或者可能是非拉丁符号)的情况。
这是执行此操作的 Java 代码(我知道它远非完美)

package com.mde.test;

import static com.intuit.ipp.query.GenerateQuery.$;
import static com.intuit.ipp.query.GenerateQuery.select;
import java.util.LinkedList;
import java.util.List;

import com.intuit.ipp.core.Context;
import com.intuit.ipp.core.ServiceType;
import com.intuit.ipp.data.Item;
import com.intuit.ipp.exception.FMSException;
import com.intuit.ipp.query.GenerateQuery;
import com.intuit.ipp.security.OAuthAuthorizer;
import com.intuit.ipp.services.DataService;
import com.intuit.ipp.util.Config;

public class TestEncoding {

public static final String QBO_BASE_URL_SANDBOX = "https://sandbox-quickbooks.api.intuit.com/v3/company";

private static String consumerKey = "consumerkeycode";
private static String consumerSecret = "consumersecretcode";
private static String accessToken = "accesstokencode";
private static String accessTokenSecret = "accesstokensecretcode";
private static String appToken = "apptokencode";
private static String companyId = "companyidcode";

private static OAuthAuthorizer oauth = new OAuthAuthorizer(consumerKey, consumerSecret, accessToken, accessTokenSecret);

private static final int PAGING_STEP = 500;


public static void main(String[] args) throws FMSException {
List<Item> res = findAllServices(getDataService());
System.out.println(res.get(1).getName());
}

public static List<Item> findAllServices(DataService service) throws FMSException {
Item item = GenerateQuery.createQueryEntity(Item.class);
List<Item> res = new LinkedList<>();

for (int skip = 0; ; skip += PAGING_STEP) {
String query = select($(item)).skip(skip).take(PAGING_STEP).generate();
List<Item> items = (List<Item>)service.executeQuery(query).getEntities();
if (items.size() > 0)
res.addAll(items);
else
break;
}
System.out.println("All services fetched");
return res;
}

public static DataService getDataService() throws FMSException {
Context context = getContext();
if (context == null) {
System.out.println("Context is null, something wrong, dataService also will null.");
return null;
}
return getDataService(context);
}

private static Context getContext() {
try {
return new Context(oauth, appToken, ServiceType.QBO, companyId);
} catch (FMSException e) {
System.out.println("Context is not loaded");
return null;
}
}

protected static DataService getDataService(Context context) throws FMSException {
DataService service = new DataService(context);
Config.setProperty(Config.BASE_URL_QBO, QBO_BASE_URL_SANDBOX);
return new DataService(context);
}
}

此文件以 UTF-8 格式保存。它打印出类似

All services fetched
Сэрвыс, отнюдь

但是!当我用带有 BOM 的 UTF-8 格式保存此文件时...我得到了正确的数据!

All services fetched
Сэрвыс, отнюдь

有谁能解释一下发生了什么吗? :)
//我使用 Eclipse 运行代码

最佳答案

您正在从与您不共享相同字节顺序的系统中获取数据,因此当您使用 BOM 保存文件时,它会在文件中添加足够的信息,以便将来的程序将以远程系统的字节顺序读取它.

当您在没有 BOM 的情况下保存它时,它会按照远程系统的字节顺序写入文件,而不会指示存储的字节顺序,因此当您读取它时,您会使用本地系统的(不同)字节顺序来读取它。这会混淆多字节字符中的字节,使输出显得毫无意义。

关于Java文件编码魔法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29227597/

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