【发布时间】:2017-12-27 16:17:31
【问题描述】:
我有这个很久以前从某个地方抓到的函数:
function decode_base64(s)
{
var e = {}, i, b = 0, c, x, l = 0, a, r = '', w = String.fromCharCode, L = s.length;
var A = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
for(i = 0; i < 64; i++)
e[A.charAt(i)] = i;
for(x = 0; x < L; x++)
{
c = e[s.charAt(x)];
b = (b << 6) + c;
l += 6;
while(l >= 8)
((a = (b >>> (l -= 8)) & 0xff) || (x < (L - 2))) && (r += w(a));
}
return r;
};
在我的 C# 应用程序中,我像这样对字符串进行编码:
Convert.ToBase64String(Encoding.Default.GetBytes(str));
然后我生成嵌入这些字符串的 html 文件。
然后 JS 脚本像这样解码它:
decode_base64(str);
英文字母一切正常,但本地字母却不行。它们解码成奇怪的符号。
Convert.ToBase64String(Encoding.Default.GetBytes("HTML_SubunitsNavigator0"));
decode_base64(str); -> HTML_SubunitsNavigator0
Convert.ToBase64String(Encoding.Default.GetBytes("Чекбокс")); //my native language
decode_base64(str); -> ×åêáîêñ
我将页面编码设置为<meta http-equiv = 'Content-Type' content = 'text/html; charset = windows-1251' />,但这没有帮助。
我尝试使用其他 base64 解码函数,例如:http://www.webtoolkit.info/javascript-base64.html 但似乎在这些函数内部发生了一些错误,并且脚本在我调用解码方法的地方停止执行。
我尝试了btoa,但它解码为...另一个“base64 可查找”序列。
我尝试将Encoding.UTF8.GetBytes( 与其他脚本一起使用,但这些脚本仍然停止执行。
我能做些什么来以某种方式正确地用母语解码 base64?
【问题讨论】:
-
字符集应设置为 utf-8 并在所有地方设置为相同。这篇文章可能会回答你的问题:stackoverflow.com/questions/2587136/…
-
@jeff - Eww 我这样做了,但唯一改变的是奇怪的符号。现在它们是:ЧекбокÑ。并且我使用Ecoding.UTF8生成base64和写html文件。
-
btoa()用于编码为Base64,用于解码atob()! -
@Sirko - 呃,我只是搞砸了那些。反正它们对我没用,因为出现在 IE10 中,但我需要支持较低的 IE。
-
使用你提到的脚本我得到了正确的结果fiddle.jshell.net/leighking2/bxdd7489。检查浏览器实际看到的 js,并确保它正在尝试对字符 Чекбокс 进行编码。如果这被硬编码到 js 中,那么它可能在传输过程中被更改。我在 moment.js 中遇到了翻译混乱的问题,问题是文件以 ISO-8859-1 而不是 UTF-8 的形式交付。
标签: javascript encoding base64