首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将qstring转换为qchar特殊字符

将qstring转换为qchar特殊字符
EN

Stack Overflow用户
提问于 2016-02-12 05:53:09
回答 3查看 1.3K关注 0票数 2

我正在开发一个解析器。我想一个字符一个字符地解析文本文件。

代码语言:javascript
复制
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)

有没有一种简单的方法来归档它?谢谢。

EN

回答 3

Stack Overflow用户

发布于 2016-02-12 07:26:32

解析文本很快就变成了一件非常麻烦的事情。如果希望将两个字符的序列\ n识别为换行符\n,则比较单个字符(c == ft)是不够的。您可以记住前一个字符,并检查当前字符和前一个字符。

代码语言:javascript
复制
QString parse(QString const& text)
{
    static QChar BACKSLASH('\\');
    static QByteArray const SPECIAL_CHARS ("\"'?abfnrtv");
    static QString    const SPECIAL_QCHARS ("\\\"\'\?\a\b\f\n\r\t\v") ;

    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;
}
票数 1
EN

Stack Overflow用户

发布于 2016-02-12 16:16:45

您是否期望QString fieldTerminator = "\n“长度为1个字符并包含‘行尾’?它不是这样工作的: fieldTerminator有两个字符:'\‘和'n';如果你想遵循printf()逻辑,你应该自己实现它(或者使用一些其他的字符串解析函数)

另外,如果我正确理解了解析器的逻辑,我会建议对参数fieldTerminator、lineTerminator、encloseChar使用QChar --这些应该是一个字符,而不是字符串。

票数 0
EN

Stack Overflow用户

发布于 2016-02-14 02:39:02

代码语言:javascript
复制
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;
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35350801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档