Vin*_*rat 3 android nsstring ios
我需要将一些聊天代码从iOS移植到Android.在将聊天消息发送到套接字之前,iOS代码使用NSNonLossyASCIIStringEncoding该类作为NSString :: dataUsingEncoding的参数.
你会如何在Android中做到这一点?关于相反解码的相同问题.
例如,如果不这样做,换行符就会消失在另一个移动设备上收到的消息中.
iOS上的代码:
NSData *data1 = [myStringTosend dataUsingEncoding:NSNonLossyASCIIStringEncoding];
NSString *goodValue = [[[NSString alloc] initWithData:data1 encoding:NSUTF8StringEncoding] autorelease];
Run Code Online (Sandbox Code Playgroud)
并解码:
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
Run Code Online (Sandbox Code Playgroud)
到目前为止(并且不正确),在Android端进行编码:
OutputStream os = socket.getOutputStream();
os.write(request.getBytes("UTF-8"));
os.flush();
Run Code Online (Sandbox Code Playgroud)
并解码:
while ((bytesRead = is.read(buffer, 0, BUFFER_SIZE)) >= 0) {
if (bytesRead > 0) response.append(new String(buffer, 0, bytesRead, "UTF-8"));
if (bytesRead < BUFFER_SIZE) break;
}
Run Code Online (Sandbox Code Playgroud)
@portforwardpodcast是绝对正确的,如果可能的话,你应该避免对你的utf8进行ASCII编码,而是设置你的堆栈来直接处理/存储utf8.也就是说,如果您无法更改行为,则以下代码可能会有所帮助.
虽然没有公布的解释如何NSNonLossyASCIIStringEncoding工作,但根据其输出,它看起来像:
ñ使用十进制值241 - > \361)\ud83d\ude25)所以编码:
public static String encodeToNonLossyAscii(String original) {
Charset asciiCharset = Charset.forName("US-ASCII");
if (asciiCharset.newEncoder().canEncode(original)) {
return original;
}
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < original.length(); i++) {
char c = original.charAt(i);
if (c < 128) {
stringBuffer.append(c);
} else if (c < 256) {
String octal = Integer.toOctalString(c);
stringBuffer.append("\\");
stringBuffer.append(octal);
} else {
String hex = Integer.toHexString(c);
stringBuffer.append("\\u");
stringBuffer.append(hex);
}
}
return stringBuffer.toString();
}
Run Code Online (Sandbox Code Playgroud)
并进行解码(通过在锁定步骤中解析两种类型的编码,而不是两次单独的传递,可以提高效率):
private static final Pattern UNICODE_HEX_PATTERN = Pattern.compile("\\\\u([0-9A-Fa-f]{4})");
private static final Pattern UNICODE_OCT_PATTERN = Pattern.compile("\\\\([0-7]{3})");
public static String decodeFromNonLossyAscii(String original) {
Matcher matcher = UNICODE_HEX_PATTERN.matcher(original);
StringBuffer charBuffer = new StringBuffer(original.length());
while (matcher.find()) {
String match = matcher.group(1);
char unicodeChar = (char) Integer.parseInt(match, 16);
matcher.appendReplacement(charBuffer, Character.toString(unicodeChar));
}
matcher.appendTail(charBuffer);
String parsedUnicode = charBuffer.toString();
matcher = UNICODE_OCT_PATTERN.matcher(parsedUnicode);
charBuffer = new StringBuffer(parsedUnicode.length());
while (matcher.find()) {
String match = matcher.group(1);
char unicodeChar = (char) Integer.parseInt(match, 8);
matcher.appendReplacement(charBuffer, Character.toString(unicodeChar));
}
matcher.appendTail(charBuffer);
return charBuffer.toString();
}
Run Code Online (Sandbox Code Playgroud)