【问题标题】:not able to convert "£12" nsstring to ascii format无法将 "£12" nsstring 转换为 ascii 格式
【发布时间】:2014-11-19 15:06:27
【问题描述】:

我正在尝试将 nsstring(密码)转换为 MD5 和 base64。对于 Ascii 字符,一切正常,但是当我尝试测试“£”或“?”时签名,MD5 给了我一些垃圾值。我的服务器端失败了。

NSData *pwdData = [password dataUsingEncoding:NSUTF16StringEncoding allowLossyConversion:YES];

unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(pwdData.bytes, pwdData.len, result);

[Base64 initialize];
[Base64 encode:result length:CC_MD5_DIGEST_LENGTH];

但同样的事情在 Android 中也能正常工作。

   MessageDigest msgDigest = java.security.MessageDigest.getInstance("​MD5");

    msgDigest.update(s.getBytes("US-ASCII"));
    byte bytes[] = msgDigest.digest();    

    return android.util.Base64.encodeToString(bytes,​ Base64.NO_WRAP);

我不确定是 MD5 还是 BASE64 有问题?当 Android 做同样的事情并且它工作正常时。

【问题讨论】:

  • 我不是 Java 专家,但我会将 s.getBytes("US-ASCII") 解释为 “转换为 7/8 位 ASCII”。然后你第二次用s.getBytes() 更新摘要?我想这次它会使用 Java 的 UTF-16(LE 还是 BE?)编码?所以恕我直言,Android代码没有多大意义。另请注意,井号不是 ASCII 的一部分。
  • 至少iOS和Android代码不会在同一个字节数组上计算MD5,这是肯定的!
  • 为什么你认为 CC_MD5 会给你垃圾值?
  • 抱歉,您希望字符串使用哪种字节编码? ASCII 还是 UTF-16?
  • 另外,请注意,如果 Java 丢弃或转换字符,而服务器也这样做,这意味着任何带有特殊字符的密码都将处于危险之中!您几乎肯定想改用 UTF-8!

标签: android ios objective-c


【解决方案1】:

您不能使用有损编码将“£”之类的符号编码为 ASCII。这提供了删除特殊字符的转换过程。

(ASCII 字符集不包含“£”符号。它包含美国“#”符号。过去,英国机器将 ASCII 代码显示为“£”,美国机器使用“#”,但随着 Unicode 的出现,两者都有不同的字符。

您应该使用 UTF8,据我了解,它是一种输出所有 ASCII 字符的编码,带有标记非 ASCII unicode 字符的 ASCII 标签,以便在转换回 unicode 时可以“重构”它们。

(免责声明:我不是 Unicode 不同编码方面的专家。)

【讨论】:

  • 我使用了 UTF8 和 UTF32,但它仍然显示错误。不知道android是如何工作的......
  • allowLossyConversion:NO
  • 我试过 allowLossyConversion:NO 但它对我没有帮助
猜你喜欢
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
相关资源
最近更新 更多