日本語による絞込み

「まったく何も分からない・・・」そんなユーザーさんの為のフォーラムです。どんなご質問でもお気軽にどうぞ。
返信
hiroshot
アクティブユーザー
記事: 13
登録日時: 2006年3月28日(火) 10:47

日本語による絞込み

投稿記事 by hiroshot » 2006年5月08日(月) 10:11

「nXnでエントリーを表示させる方法」でお世話になったhiroshotです。
その折は、迅速な対応大変ありがとうございました。
プロジェクトは順調に進んでいるのですが、今回表題の件でさらに質問させていただきます。

現在、取り扱い製品ページを作成しています。
複数のカテゴリー分けされた商品の中に、複数の商品ブランドが存在する構成です。
カテゴリーはスキーマ上でmenu項目で取り扱っているのですが、
商品ブランドは流動的であるために、別途text項目として扱い、
これに対して絞込みを行いたいので、
(意味があるのか分からなかったのですが)
group="True” を与えています。

作成したスキーマ(captionの中身は業種が分かるので変更しています)は以下です。

コード: 全て選択

<?xml version="1.0" encoding="UTF-8"?>
<schema name="catalog" caption="カタログ">
	<data name="name" type="textarea" caption="商品名" output="text2" />
	<data name="admin_no" type="text" caption="管理ナンバー" group="True" />
	<data name="category" type="menu" caption="商品カテゴリー" group="True">
		<menuitem id="1">服</menuitem>
		<menuitem id="2">靴</menuitem>
		<menuitem id="3">かばん</menuitem>
		<menuitem id="4">アクセサリー</menuitem>
		<menuitem id="5">雑貨</menuitem>
		<menuitem id="6">文房具</menuitem>
		<menuitem id="7">デジタル製品</menuitem>
		<menuitem id="8">その他</menuitem>
	</data>
	<data name="brand_name" type="text" caption="ブランド名" group="True" />
	<data name="description" type="textarea" caption="説明" output="text2" />
	<data name="photo" type="img" caption="写真"/>
	<data name="link" type="text" caption="リンク" />
</schema>
それで、カテゴリー別のページでのリスト表示は問題ないのですが、
そこからリンクさせている、ブランドごとのページで、絞込みの表示ができません。
XSLTファイルは以下のようになっています。
(本当はテーブル化してるんですが単純化するために省略しました。)

コード: 全て選択

<<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="EUC-JP" omit-xml-declaration="yes" />
<xsl:template match="/entrylist">
<xsl:for-each select="entry">
<img src="{photo}" />
<xsl:value-of select="name" disable-output-escaping="yes" />
<xsl:value-of select="description" disable-output-escaping="yes" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

で、表示したいリスト部分のCMSDへの命令は

コード: 全て選択

<cmsd:entrylist name="catalog" design="brand" rows="50" >
<cmsd:group key="brand_name" value="プラダ" />
<cmsd:sort key="admin_no" order="asc" type="text" />
</cmsd:entrylist>
です。
おそらく、このCMSD命令の2行目は意味のないことをしてるのだと思うのですが、
どうしたらいいのか思いつかなかったので、こんな感じになってしまいました。 :oops:

text項目で入力した値で絞り込みする方法が可能かどうか、
それをするにはどのように操作するのが適当なのか、
教えていただきたいです。
また、今回のような条件で絞込みをする他の善後策等ございましたら、
ご提案いただければ幸いです。

よろしくお願いいたします。

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

Re: 日本語による絞込み

投稿記事 by webmaster » 2006年5月09日(火) 16:11

 hiroshotさん、いつもご質問ありがとうございます。

 ご質問の件ですが、そのやり方で特に問題はないはずなのですが、絞込み
されなかったでしょうか…?
 弊社では過去に同様の方法で絞込みを行った事があります。

 可能性があるとすれば、エントリの投稿後にスキーマ側でgroup="True"を
指定しても反映されないという点でしょうか。
 もしその場合には、スキーマを変更後、再度エントリを保存しなおす必要が
あります。

 それでもダメな場合、日本語環境が問題になっている可能性があります。
 一度、"abc"などの半角英数字で入力を行い、その値で絞込みを行ってみて
いただけないでしょうか?
 もしそれでうまく行くようでしたら、CMSD側のなんらかの不具合の可能性が
ありますので、またご連絡頂ければ幸いです。m(__)m
最後に編集したユーザー webmaster on 2006年5月12日(金) 10:43 [ 編集 1 回目 ]

hiroshot
アクティブユーザー
記事: 13
登録日時: 2006年3月28日(火) 10:47

投稿記事 by hiroshot » 2006年5月12日(金) 10:29

webmasterさん

返信が遅くなってすいません。
他の業務に追われていて、CMSDの調整に時間をさくことができませんでした :cry:

半角英数字での入力をためしたところ、うまくいきました :)

しかしながら、やはり日本語入力ではいまだ駄目な状態です。

となると日本語環境での問題ということになるかと思うのですが、問題点と思われる部分お分かりでしょうか?
よく分からないながら、質問させていただきたいのですが、CMSDを呼び出すPHPファイルの文字コード[EUC]とエントリデータが入っているファイルの文字コード[UTF-8]が異なっていても、CMSDに対する絞込み命令部分に含まれている日本語(今回の例だと「プラダ」)は、お互いの中でうまく対応されるようにはなっているのでしょうか?
当然、問題ないように設計されているとは思ったのですが、いろいろ思いをめぐらしていると気になったもので… :roll:

よろしくお願いいたします。

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

投稿記事 by webmaster » 2006年5月12日(金) 11:47

 webmasterです。

 半角でうまくいったということは、日本語(ダブルバイト文字)の文字コード関連
かと思われます。
 ご指摘があった部分についてソースを確認してみたのですが、EUC-JP→UTF-8の
変換を行ってから比較を行っておりました。

 ひょっとすると、php.ini 関連の問題かもしれません。

 CMS Designerは、HTTPからの入力文字コードがEUC-JPである事を前提に
動作しています。絞込み値やソート値が半角英数であれば、この点は特に問題に
ならないのですが、今回のように日本語(ダブルバイト文字)を絞込み値として
使おうとする場合には、この点が問題になる場合がありそうです。

 php.ini の設定で関係してくるのは、

mbstring.http_input = pass
mbstring.encoding_translation = 0

 の部分です。詳しくはこちらをご覧下さい。
 http://www.php.net/manual/ja/ref.mbstring.php

 CMS Designerでは通常、ブラウザに送られる文字コードはEUC-JPになるので
これで問題ないのですが、例えば

mbstring.http_input = SJIS
mbstring.encoding_translation = 1

 のようにになっていると、入力値をSJISと判断してSJIS→EUC-JP変換を行い、
文字化けしたデータをさらにCMSDが内部でUTF-8に変換しようとしておかしく
なります。
 ですから、通常は初期状態の(pass、0)ままにしておいて下さい。

 但し、例えばサイトがSJISとEUC-JPが混在していて、SJISのページ中にCMSDへの
絞込み値付きリンクが存在する場合等には、CMSDにSJISで入力される場合が
ある為、

mbstring.http_input = auto
mbstring.encoding_translation = 1

 のようにして頂く必要があります。しかしその場合、PHPの自動文字コード変換機能
が誤認識をする可能性がありますので、URLに「&dammy=雀の往来」といった
「おまじない」をつけて頂くことで、誤認識を完全に回避可能です。

 本来、CMSD側でどのような入力が来ても自動認識できればいいのですが、
PHP側で用意されている機能以上の事はできない為、現在はPHPの機能に
任せるようにしております。

 もしこれらの対処でもうまくいかなかった場合、大変申し訳ありませんが現象が
発生しているURLをメール等でご連絡頂ければ幸いです。
 cms(at)al-design.jp です。(スパム防止の為、@を(at)と表記しています)

 以上、長文になりますがよろしくお願い致します。
最後に編集したユーザー webmaster on 2006年5月12日(金) 15:06 [ 編集 1 回目 ]

hiroshot
アクティブユーザー
記事: 13
登録日時: 2006年3月28日(火) 10:47

投稿記事 by hiroshot » 2006年5月12日(金) 15:01

webmasterさん

php.ini の設定を確認してみました。

mbstring.http_input = auto
mbstring.http_output= SJIS
mbstring.encoding_translation= Off

になってましたので、(コンパイル時指定した記憶はないんですが…)

mbstring.http_input = pass
mbstring.http_output= EUC-J
mbstring.encoding_translation= 0

としてみました。

が、やはり駄目でした… :cry:

サイトのリニューアルが迫っておりますので、
とりあえずは半角数字のIDでも与えてしのぐことにします。
まだライセンス取得させていただいていないので、
インターナルの環境で実験している次第です。
ライセンス料お支払い後のサイトリニューアル時にメールを送らせていいただきます。

他に何かお心当たりがございましたら、こちらで返信していただけたら幸いです。
もう少し、php.iniの情報があったほうがよろしいでしょうか?

よろしくお願いします。
最後に編集したユーザー hiroshot on 2006年5月12日(金) 17:16 [ 編集 1 回目 ]

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

投稿記事 by webmaster » 2006年5月12日(金) 15:11

 ダメでしたか…。

 もう1点だけ、valueに指定するダブルバイト文字を、URLエンコーディングした
場合はどうなるでしょうか。
 予め、EUC-JPにてURLエンコーディングします。
 例えばこちらのサイト等が利用できるかと思います。
 http://code.cside.com/3rdpage/jp/url/converter.html

<cmsd:group key="xxx" value="あいうえお" />

 ではなく、

<cmsd:group key="xxx" value="%A4%A2%A4%A4%A4%A6%A4%A8%A4%AA" />

 のようになります。

blue
パワーユーザー
記事: 70
登録日時: 2005年1月31日(月) 20:49

お話の続きを…

投稿記事 by blue » 2008年12月18日(木) 15:53

 古いトピックを掘り起こして申し訳ありません。全く同じ案件ですのでここで話を続けさせてください。
 かれこれ十日ほど格闘していましたが、そろそろ精魂の残量が乏しくなりました。
 ざっと現況をお話ししますと次の通りです。
  • テキスト項目にグループキーを設定し、絞り込みを行ないたいこと。
    項目データは英字の場合もあれば日本語の場合もある。
    英字での絞り込みは問題なく行なえている。
    日本語の場合だと、何もヒットせず結果表示画面は真っ白。ロケーションバーには日本語がそのまま表示されている。
    →xxx.php?category=コミック
    同じ文字列を手動でURLエンコードしたものを、パラメータのお尻にくっつけてやると、正常にヒットする。
 ちなみに、埋め込みページにエンコードしたリンク(正常にヒットする)

コード: 全て選択

<a href="xxx.php?category=<?php echo urlencode("コミック"); ?>" target="_blank">一覧</a>
を直接書いて、ソースを比べてみると、
どちらも同じにエンコードされた状態の文字列が並びます。
 ところがクリックしてページが遷移するときに、CMSDからのデータのみがデコードされてしまう、らしい。
 というところまで判明しました。

 上のコメントでご指摘のあった、value値を直接埋め込んだ場合の検証をしてみると、
2バイト文字も、エンコード文字も、どちらも真っ白状態でした。

php.ini の設定は以下です。
mbstring.http_input = auto
mbstring.http_output= pass
mbstring.encoding_translation= Off

 トピックが途中で止まっているので、先のお話を伺いたいと思ったのですが、
訊ねる前に自分でどうにかできればと思いました。
 が、結局どうにもならず。。。いろいろ試しているうちにグルグルしてきました。
 お知恵を拝借できれば嬉しいです。

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

Re: お話の続きを…

投稿記事 by webmaster » 2008年12月18日(木) 17:17

 webmasterです。
 申し訳ありません、詳しく調べている時間が取れないのですが、ひょっとすると

> mbstring.http_input = auto

 が悪さをしている可能性があります。
 http_inputをautoにしていると、意図しないエンコードを引き起こすことが
あります。特に、数文字程度の短い文字列を対象にする場合、誤認識が発生し易い
です。

 http_inputをpassにするか、または mbstring.detect_order を

mbstring.detect_order = eucJP-win,UTF-8,SJIS-win,jis

 としてみてください。
 .htaccessで設定する場合は、

php_value mbstring.detect_order eucJP-win,UTF-8,SJIS-win,jis

 のようにします。

 これで現象が変わる場合、またご連絡頂ければ幸いです。

blue
パワーユーザー
記事: 70
登録日時: 2005年1月31日(月) 20:49

投稿記事 by blue » 2008年12月19日(金) 19:47

 お忙しいところ、早速のご返事恐縮です。
 お教えいただいた php.ini 設定を試してみましたが、結果は両方とも変わらず、相変わらず真っ白でした。 :cry:
 やはり php.ini の問題なのでしょうか。

 素人考えで申し訳ないですが、ひとつ気づいたことがあります。
 絞り込み結果表示ページのデザイン定義にたまたま、

コード: 全て選択

<a href="result.php{@href}" target="_blank">一覧</a>
という記述が残ってまして、これをクリックすると、正しく絞り込まれた状態の結果が出ます。
(もちろん、やってることはループみたいなことで意味はないんですが)
 ですが、ロケーションバーにはちゃんとエンコードされた文字列が並びますし、これはもしや :!:  と思いました。
 ソースを眺めてみると、viewcore.php.inc の280行目あたりに、

コード: 全て選択

$href .= '&' . urlencode($key) . '=' . urlencode($value);
がありますね。これで絞り込み条件を維持させているということかと思いますが、
今回の場合、絞り込みをかけていない状態からのパラメータ指定なので、@href が使えません。
 ソースはこんなです。

コード: 全て選択

<a href="result.php?category={category}" target="_blank">一覧</a>
 このテキスト項目 {category} に urlencode がかけられると嬉しいんですが!

返信