4

私のColdFusion(IIS 6のMX7)サイトには、検索語をURLに追加する検索機能がありますhttp://www.example.com/search.cfm/searchterm

私が遭遇している問題は、これが多言語サイトであるため、検索語が別の言語である可能性があることです。たとえば、次القاهرةのような検索URLにつながる可能性があります。http://www.example.com/search.cfm/القاهرة

問題は、URLから検索語を取得するようになったときです。私はcgi.PATH_INFO検索ページと検索語のパスを取得し、これから検索語を抽出するために使用しています。/search.cfm/searchtermただし、検索でUnicode文字が使用されている場合、それらは疑問符に変換されます/search.cfm/??????

これらは、ブラウザがUnicode文字をフォーマットできない、または出力時に壊れているのではなく、実際の疑問符として表示されます。

ColdFusionがURLでUnicodeをサポートしているかどうか、またはこれを解決して完全なURLを何らかの方法で取得する方法についての情報が見つかりません。誰かアイデアはありますか?

乾杯、

トム

編集:さらなる調査により、この問題はColdFusionではなくIISに関連している可能性があると私は信じていますが、私の元のクエリはまだ有効です。

さらに編集

その結果、問題はかなり深刻になっているように見えますGetPageContext().GetRequest().GetRequestUrl().ToString()http://www.example.com/search.cfm/searchterm/?????

4

3 に答える 3

3

ええ、それは実際にはColdFusionのせいではありません。これは一般的な問題です。

これは主に、元のCGI仕様の誤りであり、%デコードする必要があることを指定しているため、元のバイトシーケンスがPATH_INFO失われ、実際の文字が何を意味するのかがわかります。%xx

%xxまた、パス部分で送信されたバイトを常にUTF-8でエンコードされたUnicodeとして読み取ろうとするため(パスが有効なUTF-8バイトシーケンスでない場合は、Windowsのデフォルトのコードページにふっくらします)、IISのせいもあります。 、しかし、これが起こったことを知る方法はありません)。そうすると、Unicode文字列として環境変数に入れられます(envvarsはWindowsではUnicodeであるため)。

ただし、C stdioを使用するほとんどのバイトベースのツール(Perl、Python 2、PHPなどで行われるようにColdFusionに適用されると思います)は、環境変数をバイトとして読み取ろうとし、MSCランタイムはエンコードします再びWindowsのデフォルトコードページを使用したUnicodeコンテンツ。したがって、デフォルトのコードページに収まらない文字は永久に失われます。これには、WesternWindowsインストールで実行する場合のアラビア文字が含まれます。

Win32 APIに直接アクセスできる巧妙なスクリプトは、GetEnvironmentVariableWそれを呼び出してネイティブUnicode環境変数を取得し、入力がUTF-8(これが何であるか)であると仮定して、UTF-8またはその他の必要なものにエンコードできます。あなたは一般的に今日欲しいでしょう)。ただし、CodeFusionがこのアクセスを提供するとは思いません。いずれの場合も、IIS6以降でのみ機能します。IIS5.xは、デフォルト以外のコードページ文字が環境変数に到達する前にそれらを破棄します。

それ以外の場合、最善の策はURLの書き換えです。search.cfm/القاهرةCFの上のレイヤーがそれを変換できる場合、変数は%デコードされるように指定されてsearch.cfm/?q=القاهرةいないため、同じ問題に直面することはありません。したがって、バイトはCFレベルのツールが認識できる場所に残ります。QUERY_STRINGPATH_INFO%xx

于 2010-05-04T22:15:58.623 に答える
2

できることは次のとおりです。

<cfset url.searchTerm = URLEncodedFormat("القاهر", "utf-8") >

<cfset myVar = URLDecode(url.searchTerm , "utf-8") >

もちろん、その場合は次のようなもので作業することをお勧めします。

yourtemplate.cfm?searchTerm =%C3%98%C2%A7%C3%99%E2%80%9E

次に、IISでURLの書き換えを行います(アプリのフレームワーク/残りの部分でまだ行われていない場合)http://learn.iis.net/page.aspx/461/creating-rewrite-rules-for-the-url-rewrite -module/パターンに一致します。

于 2010-05-04T14:44:29.523 に答える
0

setEncoding()関数を使用して、URLとFORMスコープの文字エンコードを設定できます。

http://www.adobe.com/livedocs/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=ColdFusion_Documentation&file=00000623.htm

このスコープ内の変数にアクセスする前に、これを行う必要があります。

ただし、これらのスコープのデフォルトのエンコーディングはすでにUTF-8であるため、これは役に立たない可能性があります。また、これはおそらくCGIスコープには影響しません。

IISサーバーは正しい文字を要求ログに記録していますか?

于 2010-05-04T12:47:56.153 に答える