사용자B
응B?B
ldap브라우저로 보았을경우 한글이 이렇게 깨져서 들어갑니다
C프로그램에서 "사용자" " 응" 등의 입력값이 utf8인지 확인한다음 공백을 제거하고
utf8로 변환해서 insert하면 잘들어가긴 하는데 위와같이보입니다.
무엇을 잘못했나요?
지금 일주일째 고생입니다.ㅠ.ㅠ
송상준씨 글 잘읽었습니다 부디 ................
음 utf8로 컨버징할때 쓰레기 값이 들어가지 않았나요?
"사용자"를 UTF8로 바꾸고 이를 base64 encoding한 값이 아래와 같이
나와야 합니다. 확인해 보세요
그럼
7IKs7Jqp7J6Q
쓰레기 값은 들어가지 않았습니다. 공백도 다 제거 해보았구요
먼저 질문입니다.
한글이 들어왔을때 utf인지 확인한후 아니면 utf로 바꾸어서 넣어주는것이 맞나요?
전 그렇게 알고 있는데요
근데 이 쓰레기 때문에..ㅠ.ㅠ.
해당부분 소스 입니다.
EncodeUTF8 API가 잘못된거 아닌가 하는데요??
말씀하신대로는 잘나옵니다. 글자수에 관련이 있는거 같기두 하구요
도대체 무엇을 잘못했는지 모르겠습니다. ㅠ.ㅠ.
char *attribute_cn[2];
char str[100]="자우";
if(is_utf8(str)==0) { if(EncodeUTF8((const unsigned char*)str, &utf8_buf, &utf8_len) == -1) { sprintf(errmsg,"EncodeUTF8 Fail"); goto NADE_ADMIN_ID_INSERT_FAIL ; } attribute_cn[0] = utf8_buf; attribute_cn[1] = NULL; sprintf(dn,"cn=%s, ou=ids, o=itnade,c=kr",utf8_buf); } mods[0]->mod_op = 0; mods[0]->mod_type = "objectclass"; mods[0]->mod_values = object_vals;
mods[1]->mod_op = 0; mods[1]->mod_type = "cn"; mods[1]->mod_values = attribute_cn;
utf8encoder 문제가 맞습니다.
utf8encoder내부 소스를 보니까
메모리를 할당만하고 클리어를 안해서 뒤에 쓰레기가
붙는 문제였네요
아래는 제가 작성한 C언어를 사용하여 LDAP에 값을 입력하고 그값을 가져와 비교하는 프로그램의 일부분입니다.
아래 프로그램에서 한글은 입력해보지 않았지만 제 생각에는
mods[ 8 ]->mod_op = LDAP_MOD_ADD | LDAP_MOD_BVALUES;
이분분에서 mod_op부분을 조금 수정해 주면 되지 않을까 생각합니다
지금은 바이너리 값으로 설정 되어 잇는데 utf8로 설정해서 저장하면은 되지 않을까 생각합니다. 혹시 참고가 됬으면해서 올립니다.
그리고 결과 나오면 저도 좀 알려주세요 앞으로 필요하질 모를것 같아서요 꼭 이요~ 고생하십시오
-----------------------------------------------------------
int my_ldap_add(char *buf,int size)
{
....................
struct berval *test[2];
struct berval tttt;
test[0] = &tttt;
test[0]->bv_len = size;
test[0]->bv_val = buf;
test[1] = NULL;
..........................
if(ldap_set_option(ld,LDAP_OPT_PROTOCOL_VERSION,(void *)&version)){
printf("Failed to set protocol version to 3\n");
}
else {
printf(" Using LDAPv3\n");
......................................
mods = ( LDAPMod ** ) malloc(( NMODS + 1 ) * sizeof( LDAPMod * ));
if ( mods == NULL ) {
for ( i = 0; i < NMODS; i++ ) {
if (( mods[ i ] = ( LDAPMod * ) malloc( sizeof( LDAPMod ))) == NULL ) {
.........................
mods[ 8 ]->mod_type = "RSAKey";
mods[8]->mod_bvalues = test;
mods[9]=NULL;
if (( msgid = ldap_add ( ld, "sn=test13,o=eci,o=Mokpo,dc=mmu,dc=com", mods )) < 0 ) {
ldap_perror( ld, "ldap_add" );
free_mods( mods );
ldap_unbind( ld );
LDAP 서버에 공개키 값을 저장할 때 공개키 값은 바이너리 값이므로 mods 구조체의 mod_op에 바이너리 값을 넣기 위하여 LDAP_MOD_BVALUES 추가하고, struct berval의 bv_val에 키 값을 저장하여 LDAP 서버에 저장하였다.
다음은 server 부분의 소스이다.
initrand64_lt();
initrandBBS_lt();
RSApub new_public_key;
my_ldap_search(temp);
rd_pub_key(new_public_key);
.........
const UCHAR* const mess1 = rndmess (BLCKLNGTH);
cout_bytes ((const char*)mess1, BLCKLNGTH, "Message_1");
cout << endl;
LINT cipher = new_public_key.crypt (mess1, BLCKLNGTH);
cout << "Message_1 encrypted." << endl;
cout << "Ciphertext = " << cipher << endl;
cout<<"Save Ciphertext "<<endl;
sv_encrypted(cipher);
return 0;
LDAP 서버로부터 공개키 값을 검색을 할 때 키의 값이 바이너리 값이므로 다음과 같이 ldap_get_values_len을 사용하여 키 값을 검색해서 저장한다.
ber_valu=ldap_get_values_len(ld,entry,attr);
write_file(ber_valu[i-1]->bv_val,ber_valu[i-1]->bv_len);