1

curl するページに設定されている文字セットは Shift_JIS で、lang は jp に設定されています

    function jp_new ($jp_text) 
{
// Begin Curl
$session = curl_init();
//$url1 = "http://nihongo.j-talk.com/index.php";
$url1 = "http://www.romaji.org/index.php";
$parameters = '&text='.urlencode($jp_text).'&save=convert+text+to+Romaji';
$header = array(
"Accept-Language: jp",
"Accept-Charset: Shift_JIS");
// $header[] = "Accept-Language: ja"; 
//$parameters = 'kanji='.urlencode($jp_text).'&converter=spaced&Submit=Translate+Now';
curl_setopt($session, CURLOPT_HTTPHEADER, $header); 
curl_setopt($session, CURLOPT_POSTFIELDS, $parameters);
curl_setopt($session, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
curl_setopt($session, CURLOPT_POST, true);
curl_setopt($session, CURLOPT_URL, $url1);
$jp_page = curl_exec($session); 
curl_close($session);

//$pattern = "/romaji'>(.+?)</s";
$pattern = "/color=\"red\">(.+?)</s";
preg_match_all ($pattern, $jp_page, $result_ro);
return $result_ro[1];

}

romaji.com から手動でフォームを送信した場合と同じ結果ではありません。jptext = "犬猫" が "kou (kigou)(kigou) shin i" の場合の結果

preg マッチは 1 つのマッチのみを見つけ、それを適切な場所で見つけると確信しています。ある種のエンコーディングの問題のように見えますが、実際にはそうではありません。

"http://nihongo.j-talk.com/index.php" (コメントアウトされた変数) に対して同様のカールが機能しましたが、禁止されているようですので、この新しい URL romaji.org で機能するように適応させる必要があります。

更新: romaji.org ページの文字セットは Shift_JIS で、私のページは UTF-8 なので、コード例のように curlopt ヘッダーを curl に追加しようとしましたが、出力の結果はほとんど異なりませんでした。角かっこが削除されましたが、結果はまだめちゃくちゃです。

4

2 に答える 2

0

ブラウザーごとに異なる結果が得られる場合、目的はブラウザーから送信された同じデータをシミュレートすることです。通常異なるのは、Cookie を含む「ヘッダー」です。

パート 1: ヘッダーのトラップ

  1. さまざまなブラウザーのネットワーク監視ツールを使用できます (Chrome / IE で F12 を押すか、Firebug をインストールしてネットワーク モニターを見つけます)。ロギングを開始し、送信されたリクエストを確認します。具体的には、ヘッダーを探します。
  2. 「 Fiddler」を使用すると、これが簡単になる場合があります。
  3. ヘッダーを確認し、リクエストとともに送信される Cookie を確認します。Cookie の場合は、過去にさかのぼって Cookie がどのようにそこに到達したかを解明する必要があるかもしれませんが、今のところ、ハード コードすることはできません。

パート 2: ヘッダーの送信

あなたの場合、それはおそらく「Accept-Charset」および「Accept-Language」ヘッダーです。これらを指定できます

$headers = array(
    "Accept-Language: en-us",
    "Accept-Charset: utf-8");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

他のヘッダーが必要な場合は、配列に追加します。Cookie が必要な場合は、ドキュメントに従うか、Google で他の例を参照してください。

注: 「POSTFIELDS」も設定していることに気付きましたが、実際には POST を送信することを指定していません。POST として送信する場合は、次を追加します。

curl_setopt($ch, CURLOPT_POST, true);
于 2012-12-04T03:53:20.427 に答える
0

単純な変換でうまくいく

$jp_text = iconv('UTF-8','Shift_JIS' , $jp_text);

または

$jp_text = mb_convert_encoding($jp_text, "Shift_JIS", "UTF-8");

あなたが実行する場合

header('Content-Type: text/html; charset=utf-8');
$str = "犬猫";
var_dump(jp_new($str));

出力

array (size=1)
  0 => string 'inuneko' (length=7)

オンラインデモ

変更された機能

header('Content-Type: text/html; charset=utf-8');
$str = "犬猫";
var_dump(jp_new($str));

function jp_new($jp_text) {
    $session = curl_init();
    $url1 = "http://www.romaji.org/index.php";
    //$jp_text = iconv('UTF-8','Shift_JIS' , $jp_text);
    $jp_text = mb_convert_encoding($jp_text, "Shift_JIS", "UTF-8");
    $parameters = '&text=' . urlencode($jp_text) . '&save=convert+text+to+Romaji';
    $header = array(
            "Accept-Language: en-US,en;q=0.8",
            "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3",
            "Referer: http://www.romaji.org/index.php",
            "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
    curl_setopt($session, CURLOPT_HTTPHEADER, $header);
    curl_setopt($session, CURLOPT_POSTFIELDS, $parameters);
    curl_setopt($session, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($session, CURLOPT_POST, true);
    curl_setopt($session, CURLOPT_URL, $url1);
    $jp_page = curl_exec($session);
    curl_close($session);

    // $pattern = "/romaji'>(.+?)</s";
    $pattern = "/color=\"red\">(.+?)</s";
    preg_match_all($pattern, $jp_page, $result_ro);
    return $result_ro[1];
}
于 2012-12-07T11:45:25.373 に答える