Skip to content

Piconix

pico pico nix piconix

Archive

Category: 技術

SharePoint 2010 にアップグレードしてから、はじめてコードを書いてみたところ、いきなりエラー。

Visual Studio 2010 で、とりあえずサイトでも取得するか、というごく簡単なコード

SPSite site = new SPSite("http://mydev");

を実行してみたものの、

System.IO.FileNotFoundException

が出ました。

何が問題だったかというと、プロジェクトのビルド設定で、x86 用になっていたため。環境は64ビットでした。これをなおしたところ、すんなり解決。

というか、影響出るんだ….。

今、dotProject を扱っています。

無事にインストールも終了し、さて適当に Company でも追加するかと思い、日本語の会社名を入力して submit したところ、会社名がカラの会社情報が作成されてしまいました。
じかにデータベースを覗いて見ても、company_name 列には何も入っていません。

試しに、データベースの管理ツールで、直接このカラの company_name を編集して日本語を入れてみました。
dotProject 上では、文字化けしました。ブラウザのエンコードをEUC_JPに変更すると、表示されました。どうも、PHP と MySQL 間でエンコードの問題が起きているようです。

解決策として、次の一行を追加することで、修正できました。イタリックの赤字の部分が、挿入した行です。

/includes/db_connect.php

// Quick hack to ensure MySQL behaves itself (#2323)
$db->Execute("SET sql_mode := ''");
mysql_set_charset("utf8");

要は、データベース接続が作成された直後に、文字コードを変えるのです。

この場所が適当かどうか、この変更の後に問題がないか、あまり詳細なテストをしていませんが、とりあえずは期待通り動いています。

ちなみに、当然ながら PHP のコードや MySQL の各種エンコード関係の設定は、UTF-8 にしたうえでの、操作です。

Google App Engineで、Data Storeにデータをまとめてアップロードしたいことがあります。データベースのデータをまとめてアップロードするような操作です。

方法は、次のページに詳細に書かれています。

データのアップロード

appcfg.py コマンドと、アップロード時の変換に使用するローダ クラスを一緒に使用するような方法です。

しかし、ここに書かれている手順をそのまま実行すると、次のようなエラーが発生します。

[ERROR?? ] Error in Thread-9: ‘ascii’ codec can’t decode byte 0xe3 in position 0: ordinal not in range(128)

メッセージ自体は、Python で日本語を扱おうとするとしばしば発生するエラーですが、これが appcfg.py コマンドを使用するときにも発生します。アップロードするCSVに、日本語が含まれていると発生します。

解決するには、ローダー クラスでUnicodeの問題を吸収すればよいです。先のページに書かれているサンプルを、次のように書き換えます。

# -*- coding: utf-8 -*-
import sys
sys.path.append('/somewhere/mysources/')

from google.appengine.tools import bulkloader
from models import myModel

class DBLoader(bulkloader.Loader):
  def __init__(self):
  bulkloader.Loader.__init__(self, 'myModel',
  [('field1', lambda x: unicode(x,'utf-8','ignore')),
  ('field2', lambda x: unicode(x,'utf-8','ignore')),
  ('field3', lambda x: unicode(x,'utf-8','ignore'))])

loaders = [DBLoader]

クラスの名前の違いやモデルの違いなどは無視してください。ポイントは、文字列をそのまま渡さずに、unicode() で明示的にUTF-8に変換しているところです。これで、エラーなくアップロードできます。