qstring to qchar specialcharacter

qstring to qchar specialcharacter

本文关键字:specialcharacter qchar to qstring      更新时间:2023-10-16

我正在研究一个解析器。我想逐个解析文本文件字符。

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;
}

这就是我现在使用的...但我希望看到更好的实现

相关文章:
  • 没有找到相关文章