【发布时间】:2019-12-09 02:29:45
【问题描述】:
我将一个字符串从 Javascript 传递给 React Native 本机 Java 模块,然后返回给 Javascript。但是,任何高 Unicode 字符(例如表情符号)在传递给 Java 后都会损坏并变成一对问号。
例如字符串"testing123????"变成"testing123??"
我怎样才能解决这个问题,让角色保持他们的价值观?
编辑: React Native 后台上传库正在处理该字符串。以下是该库中将文本(位于 parameters 字段中)传递给 Java 模块的代码摘录:
import { NativeModules, DeviceEventEmitter } from 'react-native'
export type StartUploadArgs = {
url: string,
path: string,
method?: 'PUT' | 'POST',
// Optional, because raw is default
type?: 'raw' | 'multipart',
// This option is needed for multipart type
field?: string,
customUploadId?: string,
// parameters are supported only in multipart type
parameters?: { [string]: string },
headers?: Object,
notification?: NotificationArgs
}
const NativeModule = NativeModules.VydiaRNFileUploader || NativeModules.RNFileUploader // iOS is VydiaRNFileUploader and Android is NativeModules
//...
export const startUpload = (options: StartUploadArgs): Promise<string> => NativeModule.startUpload(options)
这里是处理字符串的 Java 代码的摘录:
@ReactMethod
public void startUpload(ReadableMap options, final Promise promise) {
//...
HttpUploadRequest<?> request;
if (requestType.equals("raw")) {
request = new BinaryUploadRequest(this.getReactApplicationContext(), customUploadId, url)
.setFileToUpload(filePath);
} else {
if (!options.hasKey("field")) {
promise.reject(new IllegalArgumentException("field is required field for multipart type."));
return;
}
if (options.getType("field") != ReadableType.String) {
promise.reject(new IllegalArgumentException("field must be string."));
return;
}
request = new MultipartUploadRequest(this.getReactApplicationContext(), customUploadId, url)
.addFileToUpload(filePath, options.getString("field"));
}
request.setMethod(method)
.setMaxRetries(2)
.setDelegate(statusDelegate);
//...
if (options.hasKey("parameters")) {
if (requestType.equals("raw")) {
promise.reject(new IllegalArgumentException("Parameters supported only in multipart type"));
return;
}
ReadableMap parameters = options.getMap("parameters");
ReadableMapKeySetIterator keys = parameters.keySetIterator();
while (keys.hasNextKey()) {
String key = keys.nextKey();
if (parameters.getType(key) != ReadableType.String) {
promise.reject(new IllegalArgumentException("Parameters must be string key/values. Value was invalid for '" + key + "'"));
return;
}
request.addParameter(key, parameters.getString(key));
}
}
//...
String uploadId = request.startUpload();
promise.resolve(uploadId);
}
【问题讨论】:
-
请分享您提取此字符串的 Java 代码。这就像那里的编码问题。
-
在传递给 Java 或任何其他平台之前,您需要转义 unicode 字符。参考this方法。
-
首先显示将字符串从 JavaScript 发送到 java 的代码 - 你可能在那里编码有问题。或者,但不太可能,您在接收方做错了什么。
-
我已经用处理字符串的 JS 和 Java 代码更新了问题。
标签: javascript java react-native unicode