「カレー」はいいけど「ハンバーグ」は?

in

CocoaでMySQLデータベースを直接参照するアプリを書いているんですが、マッククライアントアプリから文字列を入力してselectをかけるだけなんですが毎度文字コードの変換で悩んでいます。MySQL側はUTF8で格納しているのでクエリを作成するときクライアント側で文字コードを変換しているのですがうまくいきません。

NSString* query = [NSString stringWithFormat:
      @"select a,b,c from sample_t where x  like '%%%s%%' limit %d;",
      [searchString UTF8String],
      maxCount,nil];

とこんな感じ。まあこれで、例えばsearchStringが「カレー」とか「ラーメン」はOKなんですが「ハンバーグ」はNGでクエリがx like %% みたいになって全件検索に...もしかして変換できないコードが含まれているかと思って直前に、

if (![searchString canBeConvertedToEncoding:NSUTF8StringEncoding])
  {
    NSLog(@"string not converted UTF8 String %@:",searchString);
    return;
  }

とやってみたんですがなんなく通過。なにか決定的な間違いを犯しているような予感...的中。最終的に、mysqlに渡すところでなんと、

mysql_query([query cString]);

とやっていました。このcStringはちょっと曲者のようでconst char*変換にあたってはdefault c-encodingを使うようでまあ要するに変換に際して情報が落ちる可能性があるらしいです。10.4以降では非推奨でかわりにcStringUsingEncodingを使って明示的にエンコードを指定する方法が推奨されていました。(今回はターゲットが10.3なのでUTF8Stringを使いますが)また、これで半日くらい悩みましたぁ。

mysql_query([query UTF8String]);

これでハンバーグもオッケーですよ。いや、子供じゃないんでハンバーグはあんまり食べませんよ。カレーは週三回までならウェルカムですけど。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/159

Comments