• 締切済み

postgresqlのC++での文字エンコード

postgresql 9.1を文字コードUTF8でインストールして windows 7 professional sp1 x64で Visual Studio 2010 C++ MFCプロジェクトでアクセスするプログラムを作成しているのですが、 libpqとodbcのPostgreSQL ODBC Driver(UNICODE) x86、いずれでも、下記のように一部がCStringA(Shift_JIS?)で操作するプログラムになっています。 あまり気にすることではないのかもしれないのですが、 UTF8をSHIFT_JISで扱おうとすると足りない特殊文字などが出てこないかと懸念しています。 libpqとodbcのPostgreSQL ODBC Driver(UNICODE) x86、または別のものでもよいので MFC C++ で UTF8で操作することはできないのでしょうか。 またはそのような懸念は無用なのでしょうか。 どなたかご教授よろしくお願い致します。 ------------------------------------------ libpq result = PQexec (connection,CStringA(sql)); if (result == NULL) { st.Format( "%s\n", PQerrorMessage (connection)); OutputDebugString(CString(st)); } ------------------------------------------ odbc CStringA param = "ああいう"; SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, param.GetLength() / 2, 0, (SQLTCHAR*)((LPCSTR)param), 0, NULL);

みんなの回答

  • Dodonpa22
  • ベストアンサー率100% (4/4)
回答No.1

Postgresはサーバの文字セット(UTF-8)とクライアント側の文字セット(SHIFT-JIS) を自動で変換する機能を提供しています。 libpqを使っているのでしたらPQClientEncodingを使って変換を明示的に 指定できます。 参照 22.2.3. サーバ・クライアント間の自動文字セット変換 http://www.postgresql.jp/document/9.1/html/multibyte.html#AEN32071

関連するQ&A

  • Postgresql JDBCのconnect error

    Vine Linux2.6, Tomcat5, Postgresql7.4.3の環境で、 簡単なDBへアクセスのJspを作りましたが、実行したら、次のエラーができましたが、解決方法を 教えてください。 JSP File: <HTML> <HEAD><TITLE>User List</TITLE></HEAD> <BODY> <%@ page import="java.sql.*" %> <TABLE BORDER=1 width="75%"> <TR><TH>UID</TH><TH>Password</TH></TR> <% Connection conn = null; Statement st = null; ResultSet rs = null; try { Class.forName("org.postgresql.Driver").newInstance(); conn = DriverManager.getConnection("jdbc:postgresql://xxx.xxxx.xx.xx:8080/webshop","postgres","xxxx"); st = conn.createStatement(); rs = st.executeQuery("select * from tbllogin"); while(rs.next()) { %> <TR><TD><%= rs.getString("fldlogid") %></TD> <TD><%= rs.getString("fldpwd") %></TD></TR> <% } %> </TABLE> <% } catch (Exception ex) { ex.printStackTrace(); %> </TABLE> Ooops, something bad happened: <% } finally { if (rs != null) rs.close(); if (st != null) st.close(); if (conn != null) conn.close(); } %> </BODY> </HTML> Tomcat5のログcatalina.out: org.postgresql.util.PSQLException: The backend has broken the connection. Possibly the action you have attempted has caused it to close. at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:168) at org.postgresql.jdbc1.AbstractJdbc1Connection.openConnectionV3(AbstractJdbc1Connection.java:291) .....

  • PostgreSQLをC言語でアクセスしようと

    PostgreSQL 8.4.8 文書にのっているサンプルプログラムの 例 30-1. libpq サンプルプログラム 1 #include <stdio.h> #include <stdlib.h> #include "libpq-fe.h" ・・・・・・・・・・・・・ をコピペしてコンパイルしたところ次のようなエラーがでました # gcc sample.c /tmp/cctZBolQ.o: In function `exit_nicely': sample.c:(.text+0xd): undefined reference to `PQfinish' /tmp/cctZBolQ.o: In function `main': sample.c:(.text+0x4a): undefined reference to `PQconnectdb' sample.c:(.text+0x5a): undefined reference to `PQstatus' sample.c:(.text+0x6a): undefined reference to `PQerrorMessage' sample.c:(.text+0xa5): undefined reference to `PQexec' sample.c:(.text+0xb5): undefined reference to `PQresultStatus' sample.c:(.text+0xc6): undefined reference to `PQerrorMessage' sample.c:(.text+0xed): undefined reference to `PQclear' sample.c:(.text+0x105): undefined reference to `PQclear' sample.c:(.text+0x119): undefined reference to `PQexec' sample.c:(.text+0x129): undefined reference to `PQresultStatus' sample.c:(.text+0x13a): undefined reference to `PQerrorMessage' sample.c:(.text+0x161): undefined reference to `PQclear' sample.c:(.text+0x179): undefined reference to `PQclear' sample.c:(.text+0x18d): undefined reference to `PQexec' sample.c:(.text+0x19d): undefined reference to `PQresultStatus' sample.c:(.text+0x1ae): undefined reference to `PQerrorMessage' sample.c:(.text+0x1d5): undefined reference to `PQclear' sample.c:(.text+0x1ed): undefined reference to `PQnfields' sample.c:(.text+0x20f): undefined reference to `PQfname' sample.c:(.text+0x26b): undefined reference to `PQgetvalue' sample.c:(.text+0x2a8): undefined reference to `PQntuples' sample.c:(.text+0x2ba): undefined reference to `PQclear' sample.c:(.text+0x2ce): undefined reference to `PQexec' sample.c:(.text+0x2de): undefined reference to `PQclear' sample.c:(.text+0x2f2): undefined reference to `PQexec' sample.c:(.text+0x302): undefined reference to `PQclear' sample.c:(.text+0x30e): undefined reference to `PQfinish' collect2: ld はステータス 1 で終了しました # # find /usr/include/ -name libpq*.h /usr/include/pgsql/internal/libpq-int.h /usr/include/pgsql/server/libpq/libpq-be.h /usr/include/pgsql/server/libpq/libpq.h /usr/include/pgsql/server/libpq/libpq-fs.h /usr/include/libpq/libpq-fs.h /usr/include/libpq-events.h /usr/include/libpq-fe.h # gcc -I/usr/include sample.c でもおなじです どうすればコンパイル出きるようになるでしょうか? よろしくお願いします

  • PostgreSQL検索

    今、htmlから値を送り、servletから、PostgreSQLへの検索処理ができず困っています。 状態としては、結果が真っ白な画面になり、ソースを見てみると、 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD> <META content="text/html; charset=shift_jis" http-equiv=Content-Type></HEAD> <BODY></BODY></HTML> となります。 JDBCは、Webサーバである、JRunでデータソースの設定をしました。 そして、その中で、JDBCのテストでPostgreSQLへの接続はできました。 servletは、1度、Accessへの検索処理を行えるもので、urlを変更して利用しようと思いまして、 Access時           Driver名  sun.jdbc:odbc.JdbcOdbcDriver        servlet url   "jdbc:odbc:test"; ODBCデータソース名   test PostgreSQL時          Driver名 org.postgresql.Driver        servlet "jdbc:postgresql://127.0.0.1:5432/PostgreSQL JDBCデータソース名  PostgreSQL 環境は、 win2k PostgreSQL-win32版      JDK-1.3 JRun 3.0 全てローカルです。 参考HPでもかまいませんので、ご教授お願いします。 

    • ベストアンサー
    • Java
  • Java PostgreSQL スクリプトレット

    スクリプトレットを使用し、ログイン画面を作成しようと考えています。 <%@ page import="java.io.*,javax.servlet.*,javax.servlet.http.*,java.net.*,java.sql.*" %> <% request.setCharacterEncoding("Shift_JIS"); String id = (String)request.getParameter("id"); String pass = (String)request.getParameter("pass"); String drv = "org.postgresql.Driver"; String dsn = "jdbc:postgresql://localhost:5432/?user=postgres&password=aipo"; String sql = "SELECT * FROM TURBINE_USER"; Connection cn = DriverManager.getConnection(dsn); Statement st = cn.createStatement(); ResultSet rs = st.executeQuery(sql); while (rs.next()) { out.println("<P>" + rs.getString(1) + "</P>"); } rs.close(); st.close(); cn.close(); %> 上記を実行すると org.apache.jasper.JasperException: Exception in JSP: /get.jsp:18 となり、 ResultSet rs = st.executeQuery(sql); の時点でエラーとなります。 Statement st = cn.createStatement(); まで正常に動作するのは確認済みです。 類似する質問に http://oshiete1.goo.ne.jp/qa3522131.html がありましたが、解決できませんでした。 どこが間違っていますでしょうか。

  • postgresql接続時

    お世話になっています。 現在、postgresqlに接続し、指定のデータがなければ、dbを切断し、 切断中に、dbに接続されたら、エラーを発生させるようなプログラムを作成しています。 その際、org.postgresql.util.PSQLException: This ResultSet is closed.のようなエラーが発生します。 原因として、ResultSetにあるというのはわかるのですが、 ソースは、以下のように組んでいます。 static Connection con = null; static Statement stmt = null; static ResultSet rs ;; try { Class.forName("org.postgresql.Driver"); // PostgreSQLの場合 con = DriverManager.getConnection ("jdbc:postgresql:sample","moon","post"); // ステートメントオブジェクトを生成 stmt = con.createStatement(); String sql = " select id,pw from login where id='test' and pw='a'"; System.out.println(sql); // クエリーを実行して結果セットを取得 rs = stmt.executeQuery(sql); boolean ba = rs.next(); //もし、idがなければ、dbを閉じる if(ba == false) { System.out.println("rs:"+rs.next()); stmt.close(); con.close(); rs.close(); } catch (SQLException e) { } catch (ClassNotFoundException c) { } catch(Exception es) { } finally { } //この時点で、指定のid,pwが存在していないので、dbは切断中 //この状態でdbにアクセスする String sql = " select * from login"; // クエリーを実行して結果セットを取得 try { // ここから if(con !=null && stmt != null && rs !=null) { while(rs.next()) { System.out.println(rs.getString("id")); } }//ここまでが、何かがおかしい else {} } catch (SQLException e) {} この場合、どこが間違っているのでしょうか? 宜しくお願いします。

  • メール送信で(1)などの丸数字の文字化けについて

    ウェブページ(charset=utf-8)からメールを送信するプログラム(Perl)について質問があります。 本文中に ---------- (1) ↓ \x{2460} ---------- と変換されてメールが届いてしまいます。 メインのCGIでは、 use utf8; を宣言しています。 utf-8のページから、CGIではパラメータを以下のように受けています。 my $query = new CGI; for my $p ($query->param) { my @v = map {Encode::decode_utf8($_)} $query->param($p); $query->param($p, @v); } my $mailtext = $query->param("mailtext"); その後、 「~(波ダッシュ)」と「-(全角マイナス)」は以下のようにを強制的に置換しました。 (これは検索して見つけることができましが、丸数字については探しきれませんでした。) $mailtext =~ tr/\x{ff5e}\x{ff0d}/\x{301c}\x{2212}/; # UTF8フラグをON $mailtext = Encode::decode_utf8($mailtext ); # UTF8からJISに変換 Encode::from_to($mailtext , "utf8", "jis", Encode::XMLCREF); としてメールを送信しています。 パラメータの受け取り方に問題があるのでしょうか? それとも丸数字などを個別に置換する方法があるのでしょうか。 色々調べて試したりしたのですがダメでした。 すみませんが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • C# 文字コード変換

    お世話になります。 宜しくお願いします。 C#でプログラムを開発しております。 その中で、文字列をShift-JISでテキストファイルへ書き出す という処理があるんですが 以下のように指定しても文字コードがUTF-8で書き出されているようです。 コードを調べましたが間違いが見つけられません。 どこか間違いはございますでしょうか。 ご教授宜しくお願いします。 ・文字コードを判別する場所 : http://encode-detector.uic.jp/tool ・テキストの形式 :ファイル名.DMD /////////////// 以下コード /////////////////////////     String param = "テキストへ書き込む内容";     System.IO.StreamWriter sw =          new System.IO.StreamWriter(             @"C:\hoge.DMD",              false,             System.Text.Encoding.GetEncoding("Shift_JIS") );     System.Text.Encoding src = System.Text.Encoding.UTF8;     System.Text.Encoding dest = System.Text.Encoding.GetEncoding("Shift_JIS");     byte[] temp = src.GetBytes(param);     byte[] sjis_temp = System.Text.Encoding.Convert(src, dest, temp);     param = dest.GetString(sjis_temp);     sw.Write(param);     sw.Close();

  • VBScript ASC関数:文字エンコード(Unicode→Shif

    VBScript ASC関数:文字エンコード(Unicode→Shift-JIS)多対一変換について 初めての質問です。 よろしくお願いいたします。 【質問】 VBScriptのASC関数で文字をShift-JISコード 表示した場合、多対一変換され、文字変換が起こります。 この多対一変換をしないように、もし対応する文字が無い場合は、 ?になるようにしたいと思いますが、良い方法は無いでしょうか? 【現象】 ラテン1補助の&#x00C0;文字(A`)の UnicodeとSift-JISコードのマップ対応が原因のようです。 具体的には、&#x00C0;は、 Unicodeでは(A`)だが、Sift-JISコードでは(A) にマップされているのです。 IMEパッドの文字コードをみるとわかります。 以下のサイトを見ると、さらに詳しく載っています。 ▼参考サイト 第7回 Unicodeからの多対一の変換[前編] http://gihyo.jp/admin/serial/01/charcode/0007 そこで、APIのwidechartomultibyte関数の wc_no_best_fit_charsを設定したエンコード方式 を使用すれば解決するというところまでは、 わかってきたのですが、これをVBScriptのASC関数 と同じ動きをするように関連付けるか、別途プログラム を作る方法がわからず困っています。 わかる方いらしたら、ご教授下さい。 よろしくお願い致します。

  • SQL Serverで文字コードUTF-8

    こんにちわ。 いつも拝見しております。 PHPでODBC接続によるSQL Serverへの問い合わせを行う部分でエラーが出て困っております。 odbc_exec()[function.odbc-exec]:SQL error:[Microsoft][ODBC SQL Server Driver][SQL Server][文字化けしたSQL文]SQL state 37000 in SQLExecDirect in C://....... SJISの時は問題なかったのですがcharsetや保存形式をUTF-8に統一してから出るようになりました。 SQL文は下記のように日本語となっております。 $str = "select 担務,部課 from group by id"; 解決策がありましたらご教示下さい。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • csvデータをPostgreSQLにコピー

    # rpm -qa | grep postgresql を実行してみると、 postgresql-python-7.2.2-1 postgresql-odbc-7.2.2-1 postgresql-7.2.2-1 postgresql-perl-7.2.2-1 postgresql-server-7.2.2-1 postgresql-devel-7.2.2-1 postgresql-contrib-7.2.2-1 postgresql-libs-7.2.2-1 postgresql-jdbc-7.2.2-1 postgresql-tcl-7.2.2-1 が表示されたため、 # postgres start を実行すると、 "root" execution of the PostgreSQL server is not permitted. The server must be started under an unprivileged user id to prevent more information on how to properly start the server. と表示されます。そこで、本サイトのQ&Aを参考にして、 # /etc/init.d/postgresql start を実行したところ、起動しました。Windows版では、pgAdminIIIのクエリーツールで以下のようにすれば、csvデータ(UTF8)をPostgreSQLの所定のテーブルにインポートできます。 COPY tablename FROM E'C:\\test\\testdata.csv' WITH CSV; Linux版ではどのようにするのでしょうか?

専門家に質問してみよう