Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算JavaScript中ISO 8859-7编码的文件的字节大小 背景_Javascript_Encoding_Character Encoding - Fatal编程技术网

计算JavaScript中ISO 8859-7编码的文件的字节大小 背景

计算JavaScript中ISO 8859-7编码的文件的字节大小 背景,javascript,encoding,character-encoding,Javascript,Encoding,Character Encoding,我正在写一种叫做的深奥的语言。它在可爱的网站上使用。如果您还不知道,很多挑战都是以字节为单位评分的。人们可以使用自己的编码或预先存在的编码 在我的语言的解释器上,我有一个字节计数器。正如您所料,它计算代码中的字节数。到目前为止,我一直在使用UTF-8en/解码器(utf8.js)。我现在使用的是ISO8859-7编码,它有希腊字符。文本上传实际上也不起作用。我需要计算上传文件中包含的实际字节数。还有,是否有办法读取所述编码文件的内容 问题: 给定从页面上的元素获得的ISO 8859-7编码的文件

我正在写一种叫做的深奥的语言。它在可爱的网站上使用。如果您还不知道,很多挑战都是以字节为单位评分的。人们可以使用自己的编码或预先存在的编码

在我的语言的解释器上,我有一个字节计数器。正如您所料,它计算代码中的字节数。到目前为止,我一直在使用UTF-8en/解码器(
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;
}