qstring to qchar specialcharacter
qstring to qchar specialcharacter
我正在研究一个解析器。我想逐个解析文本文件字符。
bool parse(QString fileName,
QString fieldTerminator,
QString lineTerminator,
QString encloseChar)
{
QChar ft = *(fieldTerminator.unicode());
QChar lt = *(lineTerminator.unicode());
QChar ec = *(encloseChar.unicode());
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly))
{
qDebug() << file.errorString();
return false;
}
QTextStream inStream(&file);
while(!inStream.atEnd())
{
QChar c;
inStream >> c;
if(c == ft)
qDebug() << "fieldterm";
else if(c == lt)
qDebug() << "lineterm";
else if(c == ec)
qDebug() << "encloseChar";
}
return true;
}
我在将fieldTerminator
等转换为特殊字符(QChar::SpecialCharacter
)时遇到问题。
例如:如果我将fieldTerminator = "n"
传递到函数中,ft = ''
(92)
有没有一种简单的方法来存档它?谢谢。
解析文本很快成为一项有状态的事情。如果要将两个字符序列
n
识别为换行符n
,则比较单个字符(c == ft
)是不够的。您可以记住前一个字符并检查当前字符和以前的字符。
QString parse(QString const& text)
{
static QChar BACKSLASH('');
static QByteArray const SPECIAL_CHARS (""'?abfnrtv");
static QString const SPECIAL_QCHARS ("\"'?abfnrtv") ;
QString result;
QChar prev;
for( int i = 0; i < text.size(); ++i)
{
QChar c = text[i];
if( prev == BACKSLASH )
{
int idx = SPECIAL_CHARS.indexOf( c );
if( idx != -1)
{
result.append( SPECIAL_QCHARS[idx] );
}
else
{
result.append( prev );
result.append( c );
}
prev = 0;
}
else
{
result.append( c );
prev = c;
}
}
return result;
}
您是否希望 QString fieldTerminator = "" 长 1 个字符并包含"行尾"?它不是这样工作的:字段终结者将是两个字符长:"\"和"n";如果你想遵循printf()逻辑,你应该自己实现它(或使用一些其他的字符串解析函数)
另外,如果我正确理解您的解析器的逻辑,我建议对参数字段使用QChar终止符,行终止符,封闭Char - 这些应该是一个字符,而不是字符串,amirite?
QChar strToChar(QString str)
{
QChar ret;
if(!str.isEmpty())
{
if(str.size() == 1)
ret = str.at(0);
else if(str.size() == 2 && str.startsWith(''))
{
// special char
QChar tmp = str.at(1);
if(tmp == ''')
ret = ''';
else if(tmp == '"')
ret = '"';
else if(tmp == '?')
ret = '?';
else if(tmp == '')
ret = '';
else if(tmp == 'a')
ret = 'a';
else if(tmp == 'b')
ret = 'b';
else if(tmp == 'e')
ret = 'e';
else if(tmp == 'f')
ret = 'f';
else if(tmp == 'n')
ret = 'n';
else if(tmp == 'r')
ret = 'r';
else if(tmp == 't')
ret = 't';
else if(tmp == 'v')
ret = 'v';
}
// hex, oct, unicode missing
}
return ret;
}
这就是我现在使用的...但我希望看到更好的实现
相关文章:
- 没有找到相关文章