2014-10-22 3 views
0

기존 FAME 데이터베이스 파일에서 적절한 문자 설명을 얻으려고합니다. 기본적으로 이것은 작동하지만 움라우트 등은 올바르게 인쇄되지 않습니다. 기본적으로이 R Package FAME에 포함 된 다음 C 함수는 R 질문보다 C 질문입니다.올바른 움라우트 문자를 포인터에서 char로 반환 하시겠습니까?

void fameWhat(int *status, int *dbkey, char **objnam, int *class, 
     int *type, int *freq, int *basis, int *observ, 
     int *fyear, int *fprd, int *lyear, int *lprd, 
     int *obs, int *range, 
     int * getdoc, char **desPtr, char **docPtr){ 
/* Get info about an object. Note that range should be an int[3] on input */ 
int cyear, cmonth, cday, myear, mmonth, mday; 
int i; 
char fdes[256], fdoc[256]; 

if(*getdoc){ 
if(strlen(*desPtr) < 256 || strlen(*docPtr) < 256){ 
    *status = HBNCHR; 
    return; 
} 
for(i = 0; i < 255; ++i) fdes[i] = fdoc[i] = ' '; 
} 
fdes[255] = fdoc[255] = '\0'; 

cfmwhat(status, *dbkey, *objnam, class, type, freq, basis, observ, 
     fyear, fprd, lyear, lprd, &cyear, &cmonth, &cday, &myear, 
     &mmonth, &mday, fdes, fdoc); 
if(*getdoc){ 
    strncpy(*desPtr, fdes, 256); 
    strncpy(*docPtr, fdoc, 256); 
} 
if(*status == 0 && *class == HSERIE) 
    cfmsrng(status, *freq, fyear, fprd, lyear, lprd, range, obs); 
return; 
} 

는 느낌 인해 포인터가 R에서이 함수를 호출하고, R 콘솔 내에서 결과를 표시 할 때 내가 어떤 적절한 움라우트을하지 않는 유형 char입니다 설명을 가리키는 desPtr를 포인터에 있다는 사실에 . 나는 FAME이 Latin-1로 인코딩 된 것을 보았습니다. R은 UTF-8입니다. ä의 경우 예를 들어 \U3e34653c이됩니다.

C에서 이미 끝내서 R에 적절한 값을 전달하는 방법이 있습니까? 아니면 R 내에서 검색하고 바꾸어야합니까?

참고 :이 스레드는 Using Unicode in C++ source code이고이 How to use utf8 character arrays in c++?입니다.

답변

1

인코딩/디코딩이 여러 개 스택 된 것 같습니다. 처음에 한 글자에 대해 어떻게 길게 유니 코드 값을 얻었습니까? 을 인 http://www.fileformat.info/info/unicode/char/00E4/index.htm :

그 긴 코드의 원시 진수 - 투 - ASCII 번역은 괄호 16 진수 값으로 해석하거나 >4E< 또는 <E4> (엔디 언에 따라 다름), 후자는의 ä 당신이 기대했던입니다 유효한 Latin-1 인코딩.

이 코드 형식을 UTF8로 변환하는 작업은이 코드를 기존 루틴에 붙여 넣을 위치가 확실하지 않지만 비교적 간단합니다. 샘플 독립형 프로그램으로서 :

#include <stdio.h> 
#include <stdlib.h> 

int main (void) 
{ 
    char input[] = "a sm<F6>rg<E5>sbord of <code>"; 
    char *sourceptr, *destptr, *endptr; 
    int latin1; 

    sourceptr = input; 
    destptr = input; 
    while (*sourceptr) 
    { 
     if (*sourceptr == '<') 
     { 
      latin1 = strtol (sourceptr+1, &endptr, 16); 
      if (endptr && *endptr == '>' && latin1 > 127 && latin1 <= 255) 
      { 
      /* printf ("we saw hex code %xh\n", latin1); */ 
      /* Quick-and-dirty converting to UTF8: */ 
       *destptr = (char)(0xc0 | ((latin1 & 0xc0) >> 6)); 
       destptr++; 
       *destptr = (char)(0x80 | (latin1 & 0x3f)); 
       destptr++; 
       sourceptr = endptr+1; 
       continue; 
      } 
     } 
     *destptr = *sourceptr; 
     sourceptr++; 
     destptr++; 
    } 
    *destptr = 0; 
    printf ("output: %s\n", input); 

    return 0; 
} 

이 유효한 16 진수 코드 다음 <위한 입력 문자열을 스캔 (그것은 라틴 1의 가정 때문에 그것은 80..FF에 한정되는 것) 및 다른 >. 찾으면 문자를 UTF8 형식으로 삽입합니다. 인식 할 수없는 시퀀스는있는 그대로 복사됩니다.

+0

+1 파일 형식 링크입니다. 얼마나 긴 문자열을 얻었습니까? 좋은 질문. 레거시 db FAME에는 C 인터페이스가 있습니다. 그래서 위의 함수를 사용하여 db에 액세스하여 설명을 얻습니다. 나는 모든 C 함수를 다시 사용할 수있는 R을 사용하여 함수에 액세스하고 R이 스크립팅 언어이기 때문에 결과를 다시 대화식으로 제공합니다. 이것은 이러한 움라우트를 제외하고 일반적으로 잘 작동합니다. 나는 왜 내가 iconv 등이 고칠 수없는 것을 얻는 지 모르겠다. –

+0

@Matt : 아마도이 간단한 인코딩을 위해 함수에서 입력 문자열을 스캔하여 발견 된 16 진수 시퀀스를 적절한 UTF8로 변환해야합니까? – usr2564301

+0

은 C 함수를 수정하거나 오히려 처리하는 것을 의미합니까? 예를 들어 줄 수 있습니까? 나는 오히려 여기에 데이터/통계/R 남자 야 :) –

관련 문제