ページ 11

%E9%BE%8D%E7%A5%9E%E9%8C%B2←こういう文字(?)をC#で

Posted: 2011年12月21日(水) 12:02
by COFE
お久しぶりです。
では早速本題に。


yahooなどで文字を検索すると
http://search.yahoo.co.jp/search?p=%E9% ... 1_sa&x=wrt
URLはこうなりますよね。(上は龍神録と検索した時のURL)


知りたいのは%E9%BE%8D%E7%A5%9E%E9%8C%B2←この文字列のことです。
私がわかる範囲では

「ああ、searchというcgiのpという変数に検索した文字列を渡してんだな、cgiは2バイト文字を受け付けないから%00とかの文字コードに変換して渡してるんだな、%00ってasciiコードの65ばんが'A'みたいなやつか」

そんな感じだと認識しているのですが、そういう意味で合っているのでしょうか?


また漢字を渡すと上に示した文字コードを返すような関数をC#で作りたいのですが、そういうことは可能でしょうか?
ちょっと上の文は日本語がわかりづらいので実際にプログラムで表すと……

[codecs]
string str = GetMojiCode("龍神録");//strには%E9%BE%8D%E7%A5%9E%E9%8C%B2が格納される!
[/code]

こんな感じです。


よろしくお願いします

Re: %E9%BE%8D%E7%A5%9E%E9%8C%B2←こういう文字(?)をC#で

Posted: 2011年12月21日(水) 12:21
by みけCAT
cgiが2バイト文字を受け付けないのではなく、URLが2バイト文字を受け付けないのです。

C#でしたか・・・C++で作ってしまいました。

コード:

#include <cstdio>
#include <iostream>
#include <string>
 
using namespace std;
 
string GetMojiCode(string str) {
        int i;
        string result="";
        char buf[10];
        for(i=0;i<str.length();i++) {
                sprintf(buf,"%%%02X",(int)((unsigned char)str[i]));
                result+=buf;
        }
        return result;
}
 
int main(void) {
        string str=GetMojiCode("龍神録");
        cout << str << endl;
        return 0;
}
http://ideone.com/zPzfN

Re: %E9%BE%8D%E7%A5%9E%E9%8C%B2←こういう文字(?)をC#で

Posted: 2011年12月21日(水) 12:46
by みけCAT
C#なら関数一個です。
ただし特殊な設定をする必要があるようです。

コード:

using System;
using System.Web;

public class Test
{
    public static string GetMojiCode(string str)
    {
        return HttpUtility.UrlEncode(str).ToUpper();
    }

    public static void Main()
    {
        string str = GetMojiCode("龍神録");
        Console.WriteLine(str);
    }
}
http://www.atmarkit.co.jp/fdotnet/dotne ... ncode.html
http://d.hatena.ne.jp/shingotada+2/20100830/1283184477

Re: %E9%BE%8D%E7%A5%9E%E9%8C%B2←こういう文字(?)をC#で

Posted: 2011年12月21日(水) 13:35
by COFE
さすがみけCATさん、お仕事早いです
どうすればいいのか検討もつかなくて自前で対応する%00系の文字コードのテーブル作ろうかとも思ってましたw
本当に助かりました、ありがとうございました。

Re: %E9%BE%8D%E7%A5%9E%E9%8C%B2←こういう文字(?)をC#で

Posted: 2011年12月21日(水) 16:24
by YuO
解決していますが……。

エスケープする時のエンコーディングがUTF-8であれば,Uri.EscapeDataStringなどが使えます。