【问题标题】:php - convert ebcdic to asciiphp - 将 ebcdic 转换为 ascii
【发布时间】:2012-05-08 13:32:50
【问题描述】:
$my_var = "1";

$connection = db2_connect ( "*LOCAL", "ISCSC", "ISCSC" );

$strSql = 'CALL LMTLIB.ARTEST(?)';

$stmt = db2_prepare ( $connection, $strSql );

db2_bind_param($stmt, 1, "my_var", DB2_PARAM_INOUT, DB2_CHAR);

$rc = db2_execute ( $stmt );

echo $my_var;

当这个代码块执行时,$my_var 的值为 ¦–¦

被调用的测试 RPGLE 程序正在返回 wow

当程序被改变时,我得到的字符是不同的......所以我知道我正在从程序中得到值。唯一的问题是,如何将这些字符从 EBCDIC 转换为 ASCII。


编辑

我尝试过使用以下方法:

mb_convert_encoding($my_var, "ASCII", "cp037");
mb_convert_encoding($my_var, "ASCII", "EBCDIC");
iconv("cp037", "ASCII", $my_var);
iconv("EBCDIC", "ASCII", $my_var);

但我收到此错误:“字符集错误,不允许从”ebcdic 转换为 ascii“”

并且,“错误的字符集,不允许从”cp037 转换为 ascii“”

【问题讨论】:

    标签: php sql ascii ibm-midrange ebcdic


    【解决方案1】:

    这适用于我们的多个系统(IBM i v7r1,PHP 版本 5.4.16):

    $ascii_value = iconv("IBM-1047","ISO8859-1", $ebcdic_value); // EBCDIC->ASCII 转换

    【讨论】:

      【解决方案2】:

      在您的 CREATE PROCEDURE 语句中,使用与您的语言相匹配的 CCSID。对于美国英语,这将是 37。示例:

      CREATE PROCEDURE buck.phptest(         
       inout parm_inout varchar (5) ccsid 37)
      LANGUAGE RPGLE                         
      NOT DETERMINISTIC                      
      CALLED ON NULL INPUT                   
      EXTERNAL NAME buck.phptest             
      PARAMETER STYLE GENERAL                
      

      【讨论】:

      • 当我们指定 ccsid 37 时,我尝试调用 SP...我收到一条消息:artest 中的过程 lmtlib 未找到指定参数。
      • 参数需要完全匹配。我发布的过程在您发布的 PHP 代码调用时有效。我在程序中使用了 varchar,并在 RPG 中使用了变量。 V5R4 在这里。
      • 所以如果我们做了 CHARACTER(4) ,而你做了 VARCHAR(4) ,那会导致我看到的问题吗?我们的主管让我可以创建程序,这样我就可以自己测试了......然后我将能够提供更好的反馈/响应:)
      • 对。我目前找不到参考(PHP 不在生产中),但我记得 PHP 变量是 SQL 的 VARCHAR。
      • 您关于“参数需要完全匹配”的陈述比我想象的更具体。我的 PHP 变量和参数名称,实际上需要匹配 SP 和 RPGLE 参数名称……而不仅仅是 SP 和 RPGLE 匹配。非常感谢您的帮助!
      【解决方案3】:

      使用以下 PHP 函数:

      $recoded = recode_string ('EBCDIC..ASCII', $my_var);
      

      【讨论】:

      • 很遗憾我没有这个功能。 "调用未定义函数'recode_string'"
      • PHP 手册说 recode_string 是 PHP 4 和 PHP 5 的一部分。
      • 我想如果必须,您可以编写自己的转换函数。网上有 EBCDIC 和 ASCII 表。
      • PHP 版本 5.2.17 ......所以我应该拥有它......我会做一些搜索以找出它抛出错误的原因并回到这个问题。谢谢你的帮助。
      • 虽然我们没有 recode_string,但我们有 mb_convert_encoding 和 iconv...但是,这些都不起作用查看我的 OP 编辑​​
      【解决方案4】:

      内置函数EBCDIC转ASCII

      我必须在窗口环境中这样做

       function ebcdic_to_ascii($ebcdic_hexstring /*expecting something like F0F1....*/)
          {
              //need to delcare it to avoid warning
      $ebcd_ascii= null;
        // here come all the conversion
      $ebcd_ascii["4A"] = "¢";
      $ebcd_ascii["4B"] = ".";
      $ebcd_ascii["4C"] = "<";
      $ebcd_ascii["4D"] = "(";
      $ebcd_ascii["4E"] = "+";
      $ebcd_ascii["4F"] = "|";
      $ebcd_ascii["5A"] = "!";
      $ebcd_ascii["5B"] = "$";
      $ebcd_ascii["5C"] = "*";
      $ebcd_ascii["5D"] = ")";
      $ebcd_ascii["5E"] = ";";
      $ebcd_ascii["5F"] = "¬";
      $ebcd_ascii["60"] = "-";
      $ebcd_ascii["61"] = "/";
      $ebcd_ascii["6A"] = "¦";
      $ebcd_ascii["6B"] = ",";
      $ebcd_ascii["6C"] = "%";
      $ebcd_ascii["6D"] = "_";
      $ebcd_ascii["6E"] = ">";
      $ebcd_ascii["6F"] = "?";
      $ebcd_ascii["79"] = "`";
      $ebcd_ascii["7A"] = ":";
      $ebcd_ascii["7B"] = "#";
      $ebcd_ascii["7C"] = "@";
      $ebcd_ascii["7D"] = "'";
      $ebcd_ascii["7E"] = "=";
      $ebcd_ascii["7F"] = " '' ";
      $ebcd_ascii["81"] = "a";
      $ebcd_ascii["82"] = "b";
      $ebcd_ascii["83"] = "c";
      $ebcd_ascii["84"] = "d";
      $ebcd_ascii["85"] = "e";
      $ebcd_ascii["86"] = "f";
      $ebcd_ascii["87"] = "g";
      $ebcd_ascii["88"] = "h";
      $ebcd_ascii["89"] = "i";
      $ebcd_ascii["91"] = "j";
      $ebcd_ascii["92"] = "k";
      $ebcd_ascii["93"] = "l";
      $ebcd_ascii["94"] = "m";
      $ebcd_ascii["95"] = "n";
      $ebcd_ascii["96"] = "o";
      $ebcd_ascii["97"] = "p";
      $ebcd_ascii["98"] = "q";
      $ebcd_ascii["99"] = "r";
      $ebcd_ascii["A1"] = "~";
      $ebcd_ascii["A2"] = "s";
      $ebcd_ascii["A3"] = "t";
      $ebcd_ascii["A4"] = "u";
      $ebcd_ascii["A5"] = "v";
      $ebcd_ascii["A6"] = "w";
      $ebcd_ascii["A7"] = "x";
      $ebcd_ascii["A8"] = "y";
      $ebcd_ascii["A9"] = "z";
      $ebcd_ascii["C0"] = "{";
      $ebcd_ascii["C1"] = "A";
      $ebcd_ascii["C2"] = "B";
      $ebcd_ascii["C3"] = "C";
      $ebcd_ascii["C4"] = "D";
      $ebcd_ascii["C5"] = "E";
      $ebcd_ascii["C6"] = "F";
      $ebcd_ascii["C7"] = "G";
      $ebcd_ascii["C7"] = "H";
      $ebcd_ascii["C9"] = "I";
      $ebcd_ascii["D0"] = "}";
      $ebcd_ascii["D1"] = "J";
      $ebcd_ascii["D2"] = "K";
      $ebcd_ascii["D3"] = "L";
      $ebcd_ascii["D4"] = "M";
      $ebcd_ascii["D5"] = "N";
      $ebcd_ascii["D6"] = "O";
      $ebcd_ascii["D7"] = "P";
      $ebcd_ascii["D8"] = "Q";
      $ebcd_ascii["D9"] = "R";
      $ebcd_ascii["E0"] = "\\";
      $ebcd_ascii["E2"] = "S";
      $ebcd_ascii["E3"] = "T";
      $ebcd_ascii["E4"] = "U";
      $ebcd_ascii["E5"] = "V";
      $ebcd_ascii["E6"] = "W";
      $ebcd_ascii["E7"] = "X";
      $ebcd_ascii["E8"] = "Y";
      $ebcd_ascii["E9"] = "Z";
      $ebcd_ascii["F0"] = "0";
      $ebcd_ascii["F1"] = "1";
      $ebcd_ascii["F2"] = "2";
      $ebcd_ascii["F3"] = "3";
      $ebcd_ascii["F4"] = "4";
      $ebcd_ascii["F5"] = "5";
      $ebcd_ascii["F6"] = "6";
      $ebcd_ascii["F7"] = "7";
      $ebcd_ascii["F8"] = "8";
      $ebcd_ascii["F9"] = "9";
      $ebcd_ascii["FF"] = "E0";
          //end of conversion
      
          // loop until there is no more conversion.
          $asciiOut = "";    
          while(strlen($ebcdic_hexstring)>1)//F0F1F2F3F -> F1F2F3F
          {
              $thisEbcdic = substr($ebcdic_hexstring, 0, 2);//F0->F1
              //if(!is_null($ebcd_ascii[$thisEbcdic]))
              $asciiOut = $asciiOut.$ebcd_ascii[$thisEbcdic];//0->01
              $ebcdic_hexstring = substr($ebcdic_hexstring, 2);//F1F2F3F -> F2F3F
          }    
      
          return $asciiOut;
      
      }
      
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多