php - преобразовать ebcdic в ascii

$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 возвращает вау

Когда программа изменяется, символы, которые я возвращаю, будут другими ... так что я знаю, что получаю значения из программы. Единственная проблема - как преобразовать эти символы из 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 »запрещено»


person adam    schedule 08.05.2012    source источник


Ответы (4)


В операторе 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                
person Buck Calabro    schedule 08.05.2012
comment
Когда мы указываем ccsid 37, и я пытаюсь вызвать SP ... я получаю сообщение: процедура lmtlib в artest не найдена с указанными параметрами. - person adam; 08.05.2012
comment
Параметры должны точно совпадать. Опубликованная мною процедура работает, когда вызывается опубликованным вами PHP-кодом. Я использовал varchar в процедуре и варьировал в RPG. V5R4 здесь. - person Buck Calabro; 08.05.2012
comment
Итак, если бы мы сделали CHARACTER (4), а вы сделали VARCHAR (4), это вызвало бы проблему, которую я вижу? Наш директор дает мне доступ к созданию процедур, чтобы я мог протестировать это самостоятельно ... и тогда я смогу предоставить более качественную обратную связь / ответы :) - person adam; 08.05.2012
comment
Правильно. Я не могу найти ссылку на данный момент (PHP здесь не работает), но, насколько я помню, переменные PHP являются переменными VARCHAR для SQL. - person Buck Calabro; 08.05.2012
comment
Ваше утверждение о том, что «параметры должны точно совпадать», было более конкретным, чем я предполагал. моя переменная PHP и имя параметра, действительно необходимое для соответствия именам параметров SP и RPGLE ... а не только совпадению SP и RPGLE. большое спасибо за помощь! - person adam; 09.05.2012
comment
Имена не имеют значения для компилятора, базы данных или PHP. Обычно они совпадают только для удобства моего собственного мозга :-) Важно то, что типы и длина данных точно совпадают. Вообще говоря, языки, не относящиеся к RPG, взаимодействующие с SQL, будут передавать строки как VARCHAR, который RPG видит как VARYING. Рад, что у тебя все получилось. - person Buck Calabro; 09.05.2012

Это работает для нас в нескольких системах (IBM i v7r1, PHP версии 5.4.16):

$ ascii_value = iconv («IBM-1047», «ISO8859-1», $ ebcdic_value); // преобразование EBCDIC-> ASCII

person C_J    schedule 14.02.2014

Используйте следующую функцию PHP:

$recoded = recode_string ('EBCDIC..ASCII', $my_var);
person Gilbert Le Blanc    schedule 08.05.2012
comment
К сожалению, у меня нет этой функции. Вызов неопределенной функции recode_string - person adam; 08.05.2012
comment
В руководстве по PHP сказано, что recode_string является частью PHP 4 и PHP 5. - person Gilbert Le Blanc; 08.05.2012
comment
Я полагаю, если вам нужно, вы можете написать свою собственную функцию преобразования. В сети есть таблицы EBCDIC и ASCII. - person Gilbert Le Blanc; 08.05.2012
comment
Версия PHP 5.2.17 ... так что я должен иметь его ... я немного поищу, чтобы выяснить, почему он выдает ошибку, и вернусь к этому. Спасибо за помощь. - person adam; 08.05.2012
comment
Хотя у нас нет recode_string, у нас есть mb_convert_encoding и iconv ... однако ни один из них не работает см. Мое редактирование OP - person adam; 08.05.2012
comment
Эта функция взята из расширения Recode, которое по умолчанию не входит в состав PHP. - person fromvega; 19.11.2020

встроенная функция 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;

}

?>
person user3165474    schedule 28.09.2016