File encoding in ASC II

Asked

Viewed 523 times

-1

I am developing a php application that generates shipping files to the database and these files have to be with the specifications below:

Coding System - Low Platform

ASC II - including the file must contain record delimiters at the end of each record, (ODOA), as well as archiving finalizer, at the end of the trailler, (1A).

This excerpt is from the Radesco manual, and I don’t know if I understand it very well. From what I could understand the shipment files have to be encoded in ASC II and how do I do that? I looked in the php manual and found a function that can encode strings for ASC II, it is called "mb_convert_encoding()" would be the way?

And these end-of-record (line) delimiters would be line breaks?

The file finalizer (1A) that the manual cites would be what the fclose() function puts at the end of the file?

2 answers

4

The spelling is "ASCII". Abbreviation for "American Standard Code for Information Interchange", which is "American Standard Code for Information Exchange".

In principle there is nothing to convert. The most common encodings, whether ISO-8859-1, WIN-1252, or even UTF-8, use the ASCII table as the basis.

ASCII are the characters from 0 to 127, according to the following table:

Caracteres "imprimíveis"
=======================================
Dec    Hex   Bin         Caractere
------ ----- ----------- --------------
 32    20    00100000    Espaço
 33    21    00100001    ! 
 34    22    00100010    " 
 35    23    00100011    # 
 36    24    00100100    $ 
 37    25    00100101    % 
 38    26    00100110    & 
 39    27    00100111    ' 
 40    28    00101000    ( 
 41    29    00101001    ) 
 42    2A    00101010    * 
 43    2B    00101011    + 
 44    2C    00101100    , 
 45    2D    00101101    - 
 46    2E    00101110    . 
 47    2F    00101111    / 
 48    30    00110000    0 
 49    31    00110001    1 
 50    32    00110010    2 
 51    33    00110011    3 
 52    34    00110100    4 
 53    35    00110101    5 
 54    36    00110110    6 
 55    37    00110111    7 
 56    38    00111000    8 
 57    39    00111001    9 
 58    3A    00111010    : 
 59    3B    00111011    ; 
 60    3C    00111100    < 
 61    3D    00111101    = 
 62    3E    00111110    > 
 63    3F    00111111    ? 
 64    40    01000000    @ 
 65    41    01000001    A 
 66    42    01000010    B 
 67    43    01000011    C 
 68    44    01000100    D 
 69    45    01000101    E 
 70    46    01000110    F 
 71    47    01000111    G 
 72    48    01001000    H 
 73    49    01001001    I 
 74    4A    01001010    J 
 75    4B    01001011    K 
 76    4C    01001100    L 
 77    4D    01001101    M 
 78    4E    01001110    N 
 79    4F    01001111    O 
 80    50    01010000    P 
 81    51    01010001    Q 
 82    52    01010010    R 
 83    53    01010011    S 
 84    54    01010100    T 
 85    55    01010101    U 
 86    56    01010110    V 
 87    57    01010111    W 
 88    58    01011000    X 
 89    59    01011001    Y 
 90    5A    01011010    Z 
 91    5B    01011011    [ 
 92    5C    01011100    \ 
 93    5D    01011101    ] 
 94    5E    01011110    ^ 
 95    5F    01011111    _ 
 96    60    01100000    ` 
 97    61    01100001    a 
 98    62    01100010    b 
 99    63    01100011    c 
100    64    01100100    d
101    65    01100101    e
102    66    01100110    f
103    67    01100111    g
104    68    01101000    h
105    69    01101001    i
106    6A    01101010    j
107    6B    01101011    k
108    6C    01101100    l
109    6D    01101101    m
110    6E    01101110    n
111    6F    01101111    o
112    70    01110000    p
113    71    01110001    q
114    72    01110010    r
115    73    01110011    s
116    74    01110100    t
117    75    01110101    u
118    76    01110110    v
119    77    01110111    w
120    78    01111000    x
121    79    01111001    y
122    7A    01111010    z
123    7B    01111011    {
124    7C    01111100    |
125    7D    01111101    }
126    7E    01111110    ~
127    7F    01111111    DEL

And this:

Caracteres de controle
=======================================
Dec    Hex   Bin         Caractere
------ ----- ----------- --------------
 10    0A    00001010    avanço de linha
 13    0D    00001101    retorno de carro
 26    1A    00011010    SUB
 (tem outros, que nao vem ao caso agora)

Just you filter the string so as to eliminate accents and special characters, so as not to have any outside of the above table. How to do, it just depends on the way you are generating each line.

To insert the characters 0x0D, 0x0A in PHP just that:

$quebra = chr( 0x0D ) . chr( 0x0A );

$final = chr( 0x1A );

PS: as already mentioned, you can use " r n", but it gives exactly the same, see in IDEONE.

Then you’ll be doing line by line:

$arquivo .= $linha . $quebra;

and in the end

$arquivo .= $final;

Example taken from actual bank remittance, but with its 0x1A added (in the original did not need it, and I separated the variables to illustrate):

$quebra = chr( 0x0D ) . chr( 0x0A );
$final = chr( 0x1A );
$cRemessa := ''
... pulei a maior parte das linhas, mas só muda o conteudo ...
$cRemessa .= '1040001300021R 01000000000000000000000000000000000000000000000000204042018000000000000200                                                                                                                                                       ' + $quebra;
$cRemessa .= '10400015         000023000007000000000009002100000000000000000000000000000000000000000000000                                                                                                                                                    ' + $quebra;
$cRemessa .= '10499999         000001000025                                                                                                                                                                                                                   ' + $quebra;
$cRemessa .= $final;

Remember to scroll to the end on the right, because the string has many white spaces.

  • I’m using the PHP_EOL constant, it doesn’t put the characters Chr( 0x0A ) + Chr( 0x0D )? and fclose() the Chr( 0x1A ) was reading the php documentation and she understands that. Can you tell me if you do this or not? Is there any way to view this in the file to debug? But anyway I will test this way you said, because when transmitting to the bank the program is accusing that has an extra character in the line and so I created the topic, I thought that would be related to file encoding

  • PHP_EOL depends on the system. It should not be used for this application label, which has specification. Fclose just closes the file, it wouldn’t make sense for him to add arbitrary characters. The content of a file is 100% the responsibility of the programmer, you decide what goes in it.

  • By the way, I find it very strange a shipment use the 0x1A, several banks I do shipping simply use a normal line break at the end of the last row (and it is interesting that in many of them the documentation was not 100% correct)

  • I put the break the way you said it and it’s not doing the line break because it will be?

  • You have to see how it is that you are testing to see the break. I hope you are checking the real file, and not looking in the browser.

  • I edited with a tested and functional example.

  • The problem is that to concatenate would be Chr( 0x0A ).Chr( 0x0D ) in php and I did not take care of it. Good now is working but the bank keep talking that it has a special characters, will the whitespace that need why would it have to be with the Chr() function? I was using str_pad

  • Either make or create the string, as long as each field is the right size (totaling 240 or 400 characters, depending on the pattern)

  • thank you so much for trying to help, but using the line break like this: Chr( 0x0A ) + Chr( 0x0D ) did not work. It creates space between one line and another and when I put as the friend Giavanni said " r n" worked at first, I could not understand but important is that it worked.

  • I edited the answer with a demo, just to give you a better test: https://ideone.com/xKS0XD

Show 5 more comments

1


The characters must contain codes ASCII 7-bit standard (from 0 to 127, that is, no UNICODE or other encoding of accents or symbols), at the end of each record/row one you will include the characters 13 and 10 (when you mount the string to write in the file put a ."\r\n"; at the end of the file, before the fclose(), send a chr(0x1a);. I recommend you use the function fwrite() and work with the file in binary format ("Wb").

  • I’ll ask you the same question I asked Bacco. These characters are not automatically set by the PHP_EOL constant and the fclose() function respectively?

  • This is a standard DOS text file, with line breaks made with CR (0x0d) and LF (0x0a) and EOF (0x1a, or CTRL+Z) marking the end of it.

  • PHP_EOL is an internal PHP definition with respect to the line breaking mechanism on the system it is running on (CR+LF on Windows, LF on Unix etc). Still recommend that you record this file in binary format to avoid unexpected surprises.

  • Thank you, it worked out the way you said. Only Chr(0x1a) I didn’t need, the bank manual is wrong, the people at the plant helped me.

  • In DOS you could create a direct text file on the command line by doing copy con arquivo.txt, then you typed the text and finished pressing, see only, «Ctrl»+«Z»... :-)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.