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));
}
機能 'any_to_server'と' SRC /バックエンド/ utilsパッケージ/ MB/mbutils.c'で 'server_to_any'を参照してください、そしてmbutils.c' –
'の先頭のコメントをご返信いただきありがとうございます。 3番目の引数のエンコーディングを指定する方法がわかりません。 どこかのエンコーディングのリストはありますか? 使用法は正しいですか? Char * sjisChar [] = server_to_any(arg、strlen(arg)、/ * sjisエンコーディング番号* /); – Yuwaz
@CraigRinger私は言及を忘れた。 – Yuwaz