2013-06-04 21 views
0

我正在編寫一個使用Raptor RDF庫來解析rdf-xml文件(UTF-8編碼)的程序(C++,Windows)。 除非解析器找到包含特殊字符的文字值(例如'μ''°''''等),否則一切都會正常發生。在這些情況下,解析器返回一個未解釋的字符串。 例如,如果解析器發現的字面意義:如何重新解釋特殊字符的「源代碼」

blaμbla

它會返回一個包含一個字符標籤:

「喇嘛\ u00B5bla」

(引號不是錯誤,返回的字符串「'由'' 「)。

我說,這個字符串是不解釋,因爲如果我直接在我的代碼寫出來,我將有預期的結果:

std::string test("bla\u00B5bla"); printf(test.c_str()); 

輸出:

blaμbla

如果我想重現th Raptor解析器返回的字符串,我應該這樣做:

std::string test("\"bla\\u00B5bla\""); printf(test.c_str()); 

輸出:

「喇嘛\ u00B5bla」

所以,我的問題是:如何重新解釋字符串中的特殊字符? 我做了一些研究,但我找不到任何答案。 任何幫助將非常有用和讚賞,謝謝。

EDIT1: 這裏示出如何得到了「非解釋」字符串一些簡化的代碼:

void triple_handler(void* user_data, raptor_statement* triple) { 
    if (triple->object->type == RAPTOR_TERM_TYPE_LITERAL){ 
     printf((char*) raptor_term_to_string(triple->object)); 
    } 
} 

輸出(假定該文件中的原始字面值是:blaμbla):

「喇嘛\ u00B5bla」

我的目標只是恢復從原來正確的字符串。

+0

你的目標是什麼?這種類型的問題尖叫「[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)」。 – Jon

+0

我猜他的目標是在字符串中包含字符'μ',而不是6個字符「\ u00B5」的文本。 – Dialecticus

+0

Bwadrochit,你能添加一小段使用Raptor的代碼嗎? – Dialecticus

回答

0

如果沒有別的辦法像問庫輸出Unicode字符串,或者當前的字符集轉換的Unicode字符基地等

或者你也可以做這樣的事情(只是僞代碼,也許錯了,只是給你一些提示,你可以將字符串轉換成wstring自己):

wstring foo(string in_src) 
{ 
    wstring out = L""; 

    for (auto i = in_src.begin(), e = in_src.end(); i != e;) 
    { 
     if (*i != '\\') 
     { 
      out += (wchar_t)*i; 

      ++i; 
     } 
     else 
     { 
      if (e - i > 1 && *(i + 1) == '\\') 
      { 
       out += L'\\'; 

       i += 2; 
      } 
      else if (e - i > 4) 
      { 
       wchar_t c; 

       if (convert_next_4_chars_as_hex_number_by_whatever_means(i + 1, c)) 
       { 
        out += c; 

        i += 5; 
       } 
       else 
       { 
        throw some_error; 
       } 
      } 
      else 
      { 
       throw some_error; 
      } 
     } 
    } 

    return out; 
} 
+0

感謝您的回答。這對我來說是一個解決方案的一半,因爲我不知道如何在這裏實現convert_next_4_chars_as_hex_number_by_whatever_means()函數。當然,我可以做我自己的個人映射來做到這一點,但我寧願避免這一點,並使用一些「標準」功能,如果有的話。 – Bwadrochit

+0

@Bwadrochit你可以使用'sscanf'或'istringstream'。但在這種情況下,實現你自己的方法要容易得多。 – BlueWanderer