计算JavaScript中ISO 8859-7编码的文件的字节大小 背景
我正在写一种叫做的深奥的语言。它在可爱的网站上使用。如果您还不知道,很多挑战都是以字节为单位评分的。人们可以使用自己的编码或预先存在的编码 在我的语言的解释器上,我有一个字节计数器。正如您所料,它计算代码中的字节数。到目前为止,我一直在使用UTF-8en/解码器(计算JavaScript中ISO 8859-7编码的文件的字节大小 背景,javascript,encoding,character-encoding,Javascript,Encoding,Character Encoding,我正在写一种叫做的深奥的语言。它在可爱的网站上使用。如果您还不知道,很多挑战都是以字节为单位评分的。人们可以使用自己的编码或预先存在的编码 在我的语言的解释器上,我有一个字节计数器。正如您所料,它计算代码中的字节数。到目前为止,我一直在使用UTF-8en/解码器(utf8.js)。我现在使用的是ISO8859-7编码,它有希腊字符。文本上传实际上也不起作用。我需要计算上传文件中包含的实际字节数。还有,是否有办法读取所述编码文件的内容 问题: 给定从页面上的元素获得的ISO 8859-7编码的文件
utf8.js
)。我现在使用的是ISO8859-7编码,它有希腊字符。文本上传实际上也不起作用。我需要计算上传文件中包含的实际字节数。还有,是否有办法读取所述编码文件的内容
问题:
给定从页面上的
元素获得的ISO 8859-7编码的文件,是否有方法获得该文件中包含的字节数?而且,给定“纯文本”(即直接放入
的文本),我如何计算其中的字节数,就好像它是按照ISO 8859-7编码的一样
我试过的
输入元素称为isogreen
。该文件位于
元素中。内容为ΦX族代码>、希腊字符、拉丁字符(每个字符应为一个字节)和中文字符(应超过一个字节(?)
作为示例,您给出的三个字符以6个字节解码(0x58=X)。另外:JavaScript与utf16一起工作,这导致了一些有趣的事情,比如(“abc.length==”ΦX族".长度)
为真
您很可能需要转到完整长度,并根据其代码值检查每个字符的长度。在某些情况下,您可能还需要检查两个字符(utf-32到utf-16)。如有必要,也需要放置和检查BOM表(如果您使用未知源的文件,则始终需要)
编辑:根据请求添加:
JavaScript中的字符编码始终采用utf-16,即字符的两个字节表示形式。这一切都很好,直到他们突然(哈!)发现两个字节并不足以表示世界上所有的字母表,所以他们将Unicode范围扩展到四个字节:utf-32
Unicode财团这么做了,但ECMA委员会没有
虽然不能说地狱已经开始了,但在某些情况下,这是非常接近的,其中之一就是你的情况,因为你想混合使用单字节编码和多字节编码,甚至是不同的编码
一个字节适合两个字节,但是三个或更多的字节不适合两个字节,所以我们发明了所谓的代理。这些代理也是为什么在JavaScript中使用它不那么简单的原因
正如我所说:一大罐蠕虫。从
正如注释中提到的@pvg,由readAsBinaryString
生成的字符串是正确的,但由于两个原因而损坏:
A.结果以ISO-8859-1编码。您可以使用函数解决此问题:
function convertFrom1to7(text) {
// charset is the set of chars in the ISO-8859-7 encoding from 0xA0 and up, encoded with this format:
// - If the character is in the same position as in ISO-8859-1/Unicode, use a "!".
// - If the character is a Greek char with 720 subtracted from its char code, use a ".".
// - Otherwise, use \uXXXX format.
var charset = "!\u2018\u2019!\u20AC\u20AF!!!!.!!!!\u2015!!!!...!...!.!....................!............................................!";
var newtext = "", newchar = "";
for (var i = 0; i < text.length; i++) {
var char = text[i];
newchar = char;
if (char.charCodeAt(0) >= 160) {
newchar = charset[char.charCodeAt(0) - 160];
if (newchar === "!") newchar = char;
if (newchar === ".") newchar = String.fromCharCode(char.charCodeAt(0) + 720);
}
newtext += newchar;
}
return newtext;
}
如果您愿意,我可以更详细地介绍这两种方法。如果这是您在服务器端收到的文件,为什么不看看文件的大小?@pvg它都是客户端的。我正在GitHub上运行它。io文件实际上是如何编码的?如何将中文字符转换为8位单字符编码?这里有些东西没有意义。@pvg我保存了这是ISO-8859-7编码文件中的文本。它可能被删除了,或者其他什么。关键是,该字符可以以明文形式出现,需要像在8859-7中编码一样进行计数。对,但是族 没有有意义的8859-7编码。由于它是一种1字符、1字节的编码,据我所知,在这种编码中,字符串或文件长度应该等于字符长度。像外行一样向我解释。我对字符编码几乎一无所知。@CᴏɴᴏʀO'Bʀᴇɴ我很确定你不会,因为如果你知道的话,你一开始就不会开始这样的事情;-)给我几分钟时间自己编辑(我不是最快的打字员)!而且,是的,“差不多“是一个相对的术语:PI不确定这是否正确,因为海报是在‘长度在8859-7’之后,所以UTF任何东西、BOM等都不是真正相关的<代码>“abc”。长度==”ΦX族".在这种情况下,长度实际上正是您想要的。@pvg(对不起,我真的应该在按enter键之前重新加载页面。)我希望您是对的,这会为OP省下很多麻烦。
function convertFrom1to7(text) {
// charset is the set of chars in the ISO-8859-7 encoding from 0xA0 and up, encoded with this format:
// - If the character is in the same position as in ISO-8859-1/Unicode, use a "!".
// - If the character is a Greek char with 720 subtracted from its char code, use a ".".
// - Otherwise, use \uXXXX format.
var charset = "!\u2018\u2019!\u20AC\u20AF!!!!.!!!!\u2015!!!!...!...!.!....................!............................................!";
var newtext = "", newchar = "";
for (var i = 0; i < text.length; i++) {
var char = text[i];
newchar = char;
if (char.charCodeAt(0) >= 160) {
newchar = charset[char.charCodeAt(0) - 160];
if (newchar === "!") newchar = char;
if (newchar === ".") newchar = String.fromCharCode(char.charCodeAt(0) + 720);
}
newtext += newchar;
}
return newtext;
}
function isValidISO_8859_7(text) {
var charset = /[\u0000-\u00A0\u2018\u2019\u00A3\u20AC\u20AF\u00A6-\u00A9\u037A\u00AB-\u00AD\u2015\u00B0-\u00B3\u0384-\u0386\u00B7\u0388-\u038A\u00BB\u038C\u00BD\u038E-\u03CE]/;
var valid = true;
for (var i = 0; i < text.length; i++) {
valid = valid && charset.test(text[i]);
}
return valid;
}
function reUnicode(text) {
var newtext = "";
for (var i = 0; i < text.length; i++) {
if (text.charCodeAt(i) === 0x80) {
newtext += String.fromCharCode((text.charCodeAt(++i) << 8) + text.charCodeAt(++i));
} else if (text.charCodeAt(i) === 0x81) {
var charcode = (text.charCodeAt(++i) << 16) + (text.charCodeAt(++i) << 8) + text.charCodeAt(++i) - 65536;
newtext += String.fromCharCode(0xD800 + (charcode >> 10), 0xDC00 + (charcode & 1023)); // Convert into a UTF-16 surrogate pair
} else {
newtext += convertFrom1to7(text[i]);
}
}
return newtext;
}