perl, работа со строками (была строка "か れ る" а стала "ã&#)

Модератор: Модераторы разделов

zls
Сообщения: 26

perl, работа со строками

Сообщение zls »

скрипт вызывается через форму
в поле "input type="text"" вводятся символы "か.れ.る"
разделенные точкой

в итоге строка вызова скрипта выглядит так:
cgi/find?ja_str=%E3%81%8B.%E3%82%8C.%E3%82%8B


далее скрипт кладет все символы в массив @b.
содержимое которого получается: @b=(か,れ,る);

далее в скрипте идет код:

Код: Выделить всё

...
print "<p>otdelno:";
 while($i<$num){
      print "[$b[$i]]";
      $i++;
  }
  print "<p>vmeste:";
  print "(@b)<p>";
...

который выводит 2 строки:

otdelno:[か][れ][る]

vmeste:(か れ る)

здесь все в порядке

далее идет код:

$b[2]=chr(12427);

изменено значение 2-го символа,цифра "12427" означает код того самого 3-го символа "る"

далее в скрипте опять идет код:

Код: Выделить всё

...
print "<p>otdelno:";
 while($i<$num){
      print "[$b[$i]]";
      $i++;
  }
  print "<p>vmeste:";
  print "(@b)<p>";
...

который выводит 2 строки:

otdelno:[か][れ][る]

vmeste:(г�‹ г‚Œ る) <----- !!!!!


видно что при выводе посимвольно (print "[$b[$i]]";) строка не изменилась, а при выводе всего массива (rint "(@b)<p>";) строка
выглядит не так как должна. Изменен был всего один символ $b[2] причем на тот же самый только изначально массив был заполнен через параметры переданные скрипту, а потом всего один элемент изменен через функцию chr(12427); присваивание значения из функции chr(12427); портит строку.

что стало со строкой а главное как правильно менять содержимое?


Код: Выделить всё

#!/usr/bin/perl

use strict;
use bytes();

use CGI qw(:standard escapeHTML);

print "Content-type: text/html\n\n";

print '<html>
<head>
  <base href="http://s2/ja/">
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
</head>
<body rightmargin=50 leftmargin=50 bgcolor="dde1c2">
<center>
';

my $str = param('ja_str');
my @b=split(/\./,$str);
my $num=scalar(@b);

parse();

sub parse()
{
  my $i=0;
  my $temp_b2;
  $i=0;
  print "<p>===== 1 =====<p>";
  print "<p>otdelno:";
  while($i<$num){
      print "[$b[$i]]";
      $i++;
  }
  print "<p>vmeste:";
  print "(@b)<p>";

  print "<p>===== 2 =====<p>";
  $temp_b2=$b[2];
  $b[2]=chr(12427);
  print "<p>otdelno:";
  $i=0;
  while($i<$num){
      print "[$b[$i]]";
      $i++;
  }
  print "<p>vmeste:";
  print "(@b)<p>";

  print "<p>===== 3 =====<p>";

  $b[2]=$temp_b2;
  print "<p>otdelno:";
  $i=0;
  while($i<$num){
      print "[$b[$i]]";
      $i++;
  }
  print "<p>vmeste:";
  print "(@b)<p>";

  print "</pre></body></html>";

}
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: perl, работа со строками

Сообщение NickLion »

Вы смешали wide-char и utf-8. Вот так будет нормально:

Код: Выделить всё

$b[2]=chr(227).chr(130).chr(139);


PS как вариант:

Код: Выделить всё

use Encode;
$b[2]=Encode::encode( 'UTF-8', chr(12427) );
Спасибо сказали: