Character encoding 将字符串转换为ISO8859-1

Character encoding 将字符串转换为ISO8859-1,character-encoding,titanium,iso-8859-1,Character Encoding,Titanium,Iso 8859 1,目的 我有一个需要sha1密码的外部Web服务,但它使用ISO8859-1字符集密码存储它。例如,密码é存储为: 1599e9fa41ec68c80230491902786bee889f5bcb(这是iso中的sha1散列) 但是,我的应用程序发送的是以下哈希: bf15be717ac1b080b4f1c456692825891ff5073d (the sha1 hash for 'é' password in utf8) 因此,无法改变这种行为:-( 问题 我要做的是将键入的密码从utf8转

目的

我有一个需要sha1密码的外部Web服务,但它使用ISO8859-1字符集密码存储它。例如,密码
é
存储为:
1599e9fa41ec68c80230491902786bee889f5bcb
(这是iso中
的sha1散列)

但是,我的应用程序发送的是以下哈希:

bf15be717ac1b080b4f1c456692825891ff5073d (the sha1 hash for 'é' password in utf8)
因此,无法改变这种行为:-(

问题

我要做的是将键入的密码从utf8转换为iso8859-1 以下是我使用的代码:

var buffer = Ti.createBuffer({length: 250});
var length = Ti.Codec.encodeString({
    source: 'é',
    dest: buffer,
    charset: Ti.Codec.CHARSET_ISO_LATIN_1
};

buffer.length = length;

var str = Titanium.Utils.sha1(buffer.toBlob());
alert(str);
这将显示以下sha1:“da39a3ee5…”,这是空字符串的sha1。 与源代码“e”相同的代码显示“58e6b3a…”,这是“e”的sha1


有人知道我做错了什么,或者我怎样才能做对吗?

嗨,我遇到了一个类似的问题,发现Ti.Codec.encodeString()函数中的参数“type”解决了我的问题

在我的例子中,我使用了ISO-8859-1(拉丁文_1)和SHA256。通过添加参数“type”,哈希SHA256是预期的。因此下面的代码适用于我:

var myString = "é";
var bytesTotal = myString.length;
var myBuffer = Ti.createBuffer({
    length : bytesTotal
});
var numLen = Ti.Codec.encodeString({
    source : myString,
    dest : myBuffer,
    type : Ti.Codec.TYPE_BYTE,
    charset : Ti.Codec.CHARSET_ISO_LATIN_1
}); 
var strSHA256 = Ti.Utils.sha256(myBuffer.toBlob());
我认为对于代码,您应该使用函数'sha1()'

更新答案!!!

@Guile警告我,上面的代码在Android上有效,但在iOS上无效

我进行了更多的调查,发现在iOS中运行此操作存在问题:

var myString = "é";
var bytesTotal = myString.length;
var numLen = Ti.Codec.encodeString({
       source : myString,
       dest : myBuffer,
       type : Ti.Codec.TYPE_BYTE,
       charset : Ti.Codec.CHARSET_ISO_LATIN_1
   }); 
在上面的代码中,如果您检查“myBuffer”中的字节,它将是拉丁字母1(ISO-8859-1)的预期值

但是当它被转换成Blob时,我们遇到了一个问题。如果您使用“myBuffer.toBlob().text”将生成一个UTF-8字符串,并且会发生某种错误,因为输出字符串为空“”

可能与转换为UTF-8的拉丁语_1缓冲区有关

我们需要转换为blob,因为Ti.Utils.sha256()需要一个字符串参数(在UTF8中)或blob参数

我们不能在函数sha256()中直接使用对象“myBuffer”,因为它不接受Tianium.Buffer类型的参数

因此,我的解决方案是找到函数Ti.Utils.sha256()的替代方法

您可以在此处找到CryptoJS代码:

我刚刚在上面的链接中下载了文件“CryptoJS v3.1.2.zip”。将其解压缩,复制并粘贴了文件“rollups/sha256.js”的代码

它在Android设备和iOS模拟器上运行


正如我之前所说,如果您使用sha1()函数(文件'rollups/sha1.js')

谢谢,但是这里的算法似乎没有问题。通过一些更精确的测试,我发现您的代码可以在android上运行,而不是在iOS上运行。。。
myBuffer.toBlob()
var hash = CryptoJS.SHA256(CryptoJS.enc.Latin1.parse("é"));
alert(hash.toString(CryptoJS.enc.Hex));