2017-11-16 17 views
3

WindowsサーバでPostgreSQL 9.5 64bit版を使用しています。 データベースの文字エンコーディングはUTF8に設定されています。PostgreSQL C言語関数の文字エンコードを変更します

マルチバイト文字列を操作する関数を作成したいと考えています。 (例えば、クレンジング、置換など)

他のシステムの文字を操作するためのC言語ロジックをコピーしました。 ロジックでは、文字コードがsjisであることが前提です。

私はC言語のロジックを変更したくないので、私は、PostgreSQLのC言語関数でUTF8からSJISに変換したいです。 convert_to関数と似ています。 (ただし、convert_to機能するので、私はTEXTタイプでそれを取得したい、はbytea型を返します。)

どのようにC言語でUTF-8からSJISに変換する方法を教えてください。

関数のスクリプトを作成します。

CREATE FUNCTION CLEANSING_STRING(character varying) 
RETURNS character varying AS 
'$libdir/MyFunc/CLEANSING_STRING.dll', 'CLEANSING_STRING' 
LANGUAGE c VOLATILE STRICT; 

C出典:私は質問のコメントで教えられた方法で成功

#include <stdio.h> 
#include <string.h> 
#include <postgres.h> 
#include <port.h> 
#include <fmgr.h> 
#include <stdlib.h> 
#include <builtins.h> 

#ifdef PG_MODULE_MAGIC 
PG_MODULE_MAGIC; 
#endif 

extern PGDLLEXPORT Datum CLEANSING_STRING(PG_FUNCTION_ARGS); 

PG_FUNCTION_INFO_V1(CLEANSING_STRING); 
Datum CLEANSING_STRING(PG_FUNCTION_ARGS) 
{ 

    // Get Arg 
    text *arg1 = (text *)PG_GETARG_TEXT_P(0); 

    // Text to Char[] 
    char *arg; 
    arg = text_to_cstring(arg1); 

    // UTF8 to Sjis 
    //Char *sjisChar[] = foo(arg); // something like that.. 

    // Copied from other system.(Assumes that the character code is sjis.) 
    cleansingString(sjisChar); 
    replaceStrimg(sjisChar); 

    // Sjis to UTF8 
    //arg = bar(sjisChar); // something like that.. 

    //Char[] to Text and Return 
    PG_RETURN_TEXT_P(cstring_to_text(arg)); 
} 
+1

機能 'any_to_server'と' SRC /バックエンド/ utilsパッケージ/ MB/mbutils.c'で 'server_to_any'を参照してください、そしてmbutils.c' –

+0

'の先頭のコメントをご返信いただきありがとうございます。 3番目の引数のエンコーディングを指定する方法がわかりません。 どこかのエンコーディングのリストはありますか? 使用法は正しいですか? Char * sjisChar [] = server_to_any(arg、strlen(arg)、/ * sjisエンコーディング番号* /); – Yuwaz

+0

@CraigRinger私は言及を忘れた。 – Yuwaz

答えて

1

#include <mb/pg_wchar.h> //Add to include. 

... 

Datum CLEANSING_STRING(PG_FUNCTION_ARGS) 
{ 

    // Get Arg 
    text *arg1 = (text *)PG_GETARG_TEXT_P(0); 

    // Text to Char[] 
    char *arg; 
    arg = text_to_cstring(arg1); 

    // UTF8 to Sjis 
    Char *sjisChar[] = pg_server_to_any(arg, strlen(arg), PG_SJIS); 

    // Copied from other system.(Assumes that the character code is sjis.) 
    cleansingString(sjisChar); 
    replaceStrimg(sjisChar); 

    // Sjis to UTF8 
    arg = pg_any_to_server(sjisChar, strlen(sjisChar), PG_SJIS); //It converts from SJIS to server (UTF 8), the third argument sets the encoding of the conversion source. 

    //Char[] to Text and Return 
    PG_RETURN_TEXT_P(cstring_to_text(arg)); 
} 
関連する問題