【问题标题】:(javascript) or (nodejs in windows) iconv from utf-8 to iso(javascript) 或 (windows 中的 nodejs) iconv 从 utf-8 到 iso
【发布时间】:2012-12-11 22:05:05
【问题描述】:

我正在使用 nodejs http.get 方法将数据发布到 php

但是 php 的字符集不是 UTF-8,它是 ISO-8859-9(土耳其语)

所以发布数据没有以正确的方式插入到数据库中,

这是我的节点 js 文件:

var data="ğüşıöç ĞÜŞİÖÇ"
var postdata="isim="+encodeURIComponent(data)+"";

var options2 = 
{
    host: "localhost",
    port: 80,
    path: "/bbb.php",
    method: 'POST',
    headers:{"Host":"localhost","Content-Length": postdata.length,'Content-Type': 'application/x-www-form-urlencoded'}
};

var post_req = http.get(options2, function (res) 
{
  var responseBody='';
  res.on('data', function (d) { responseBody += d; });
  res.on('end', function (d) 
  {
    sys.print(responseBody);
  });
}).on('error', function (e) {sys.print(e.message);});

post_req.write(postdata);
post_req.end();

这是 php 文件:

<?
header('Content-type: text/html; charset=ISO-8859-9');

$dbbaglanti=mysql_connect("localhost", "root", "");
mysql_select_db("db");
mysql_query("SET NAMES 'latin5'");


$isim = $_POST["isim"];
mysql_query("insert into deneme (isim) values ('".$isim."')");
?>

数据正在像这样插入到数据库中:ÄüÅıöç ÄÃÅİÃÃ

但我知道我是否在 php 中这样做:

$isim = iconv("utf-8","iso-8859-9",$_POST["isim"]);

数据插入没有问题 : ğüşıöç ĞÜŞİÖÇ

那么我怎样才能以正确的方式做到这一点?我用谷歌搜索了很多次,我无法弄清楚我该怎么做。我知道 nodejs 有一些 iconv 扩展,但它们适用于 linux 而不是 windows。 javascript或nodejs(windows)中有没有像iconv这样的方法?或 Windows 的任何扩展?或任何其他建议?

请不要说我把php的charset改成utf-8,我不能编辑php,我以localhost为例。

【问题讨论】:

    标签: javascript windows node.js character-encoding iconv


    【解决方案1】:

    encodeURIComponent 总是编码为 utf-8(然后将生成的 utf-8 字节转换为百分比编码),所以我猜你必须使用一个库,或者自己滚动。我使用了我的一个库中的一些代码来制作这个:

    var encodeURIComponentLatin5 = (function() {
    
        var latin5 = [
            0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD
            ,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD
            ,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F
            ,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F
            ,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F
            ,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F
            ,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F
            ,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0xFFFD
            ,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD
            ,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0xFFFD
            ,0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF
            ,0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF
            ,0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF
            ,0x011E,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7,0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x0130,0x015E,0x00DF
            ,0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7,0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF
            ,0x011F,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7,0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x0131,0x015F,0x00FF
        ];
    
        var map = {};
    
        latin5.forEach( function(v,i) {
            map[v] = i;
        });
    
        function percentEncode( num ) {
            var str = num.toString(16);
            return "%" + (str.length < 2 ? "0" + str : str).toUpperCase(); 
        }
    
        return function( str ) {
            var code, i = 0, ret = [], cp;
    
            while( !isNaN( code = str.charCodeAt(i++) ) ) {
                cp = map[code];
    
                if( !cp || code === 0xFFFD ) {
                    continue;
                }
    
                if(
                    65 <= code && code <= 90 ||
                    97 <= code && code <= 122 ||
                    48 <= code && code <= 57 ||
                    45 <= code && code <= 46 ||
                    code === 95 ||
                    code === 126
                ) {
                    ret.push( str.charAt( i-1 ) );
                }
                else {
                    ret.push( percentEncode( cp ) );
                }
            }
    
            return ret.join("");
    
        };
    })();
    
    var data="ğüşıöç ĞÜŞİÖÇ";
    var postdata="isim="+encodeURIComponentLatin5(data)+""; 
    //"isim=%F0%FC%FE%FD%F6%E7%20%D0%DC%DE%DD%D6%C7"
    

    【讨论】:

    • 你是男人!我尝试了您的代码,其中一些土耳其字符的编码正确但并非全部,当我使用您的代码发送帖子请求“ğüşıöç ĞÜŞİÖÇ”时,数据插入如下:'?ü??öç?Ü??ÖÇ'。如您所见,我们保存了 ü ö ç 和 Ü Ö Ç ,但没有保存 ı ğ ş I Ğ Ş 。
    • @İsaYeter 你能说明哪些没用吗? php的结果是什么? encodeURIComponentLatin5() 与这些字符的结果是什么?
    • @İsaYeter 好的,你能调试 php 吗?例如,echo $_POST["isim"]; 嗯。问题可能是您的 node.js 源文件未以 UTF-8 保存。因为即使在我的函数之前,结果是"ÄüÅıöç ÄÃÅİÃÃ",也就是utf-8 中的�ü�ıöç ���İ��。您使用什么文本编辑器来保存 node.js 文件?您是否将其配置为保存为 utf-8?我假设 Node.js 会以 utf-8 格式读取您的源文件。
    • 伙计,这是 php : header('Content-type: text/html; charset=ISO-8859-9'); $isim = $_POST["isim"];回声 $isim; mysql_query("插入定名 (isim) 值 ('".$isim."')") 或 die(mysql_error());这是js:var len="ğüşıöçĞÜŞİÖÇ" var a="isim="+encodeURIComponentLatin5(len)+""; sys.print("a 是:"+a+"\n"); .... res.on('end', function (d) { sys.print("response is : "+responseBody); });并且输出是:a 是:isim=%F0%FC%FE%FD%F6%E7%20%D0%DC%DE%DD%D6%C7 响应是:?????? ??????
    • @İsaYeter 很抱歉打扰,有一个错误 (67 &lt;= code &amp;&amp; code &lt;= 90) 应该是 (65 &lt;= code &amp;&amp; code &lt;= 90) 我已经编辑了我的答案
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 2015-07-07
    • 1970-01-01
    • 2011-05-20
    • 2021-09-16
    • 2011-09-04
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多