Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Compare strings with characters like "šđčćž"

Compare strings with characters like "šđčćž"

Scheduled Pinned Locked Moved Solved General and Desktop
20 Posts 6 Posters 2.6k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • KroMignonK KroMignon

    @Zgembo Can you try this

    for (int i = 0; i < data->rowCount(); i++) {
    		record = data->record(i);
    		courseName = record.value("naziv").toString();
    		if (courseName.localeAwareCompare(QStringLiteral("Uvod u informacione sisteme")) == 0)
    			uisEnrolled.append(record.value("broj").toInt());
    		else if (courseName.localeAwareCompare(QStringLiteral("Tehnologije i sistemi za podršku korisnicima")) == 0)
    			tiszpEnrolled.append(record.value("broj").toInt());
    		else if(courseName.localeAwareCompare(QStringLiteral("Računovodstveni informacioni sistemi")) == 0)
    			risEnrolled.append(record.value("broj").toInt());
    	}
    

    QStringLiteral() will ensure string is encoded in UTF8 and localeAwareCompare() should do the job!

    ZgemboZ Offline
    ZgemboZ Offline
    Zgembo
    wrote on last edited by
    #9

    @KroMignon said in Compare strings with characters like "šđčćž":

    @Zgembo Can you try this

    for (int i = 0; i < data->rowCount(); i++) {
    		record = data->record(i);
    		courseName = record.value("naziv").toString();
    		if (courseName.localeAwareCompare(QStringLiteral("Uvod u informacione sisteme")) == 0)
    			uisEnrolled.append(record.value("broj").toInt());
    		else if (courseName.localeAwareCompare(QStringLiteral("Tehnologije i sistemi za podršku korisnicima")) == 0)
    			tiszpEnrolled.append(record.value("broj").toInt());
    		else if(courseName.localeAwareCompare(QStringLiteral("Računovodstveni informacioni sistemi")) == 0)
    			risEnrolled.append(record.value("broj").toInt());
    	}
    

    QStringLiteral() will ensure string is encoded in UTF8 and localeAwareCompare() should do the job!

    I have modified the code to use QStringLiteral() and it works. Thank you. This is the code snippet.

    for (int i = 0; i < data->rowCount(); i++) {
    		record = data->record(i);
    		courseName = record.value("naziv").toString();
    		if (courseName == QStringLiteral("Uvod u informacione sisteme"))
    			uisEnrolled.append(record.value("broj").toInt());
    		else if (courseName == QStringLiteral("Tehnologije i sistemi za podršku korisnicima"))
    			tiszpEnrolled.append(record.value("broj").toInt());
    		else if(courseName == QStringLiteral("Računovodstveni informacioni sistemi"))
    			risEnrolled.append(record.value("broj").toInt());
    	}
    
    KroMignonK 1 Reply Last reply
    0
    • ZgemboZ Zgembo

      @KroMignon said in Compare strings with characters like "šđčćž":

      @Zgembo Can you try this

      for (int i = 0; i < data->rowCount(); i++) {
      		record = data->record(i);
      		courseName = record.value("naziv").toString();
      		if (courseName.localeAwareCompare(QStringLiteral("Uvod u informacione sisteme")) == 0)
      			uisEnrolled.append(record.value("broj").toInt());
      		else if (courseName.localeAwareCompare(QStringLiteral("Tehnologije i sistemi za podršku korisnicima")) == 0)
      			tiszpEnrolled.append(record.value("broj").toInt());
      		else if(courseName.localeAwareCompare(QStringLiteral("Računovodstveni informacioni sistemi")) == 0)
      			risEnrolled.append(record.value("broj").toInt());
      	}
      

      QStringLiteral() will ensure string is encoded in UTF8 and localeAwareCompare() should do the job!

      I have modified the code to use QStringLiteral() and it works. Thank you. This is the code snippet.

      for (int i = 0; i < data->rowCount(); i++) {
      		record = data->record(i);
      		courseName = record.value("naziv").toString();
      		if (courseName == QStringLiteral("Uvod u informacione sisteme"))
      			uisEnrolled.append(record.value("broj").toInt());
      		else if (courseName == QStringLiteral("Tehnologije i sistemi za podršku korisnicima"))
      			tiszpEnrolled.append(record.value("broj").toInt());
      		else if(courseName == QStringLiteral("Računovodstveni informacioni sistemi"))
      			risEnrolled.append(record.value("broj").toInt());
      	}
      
      KroMignonK Offline
      KroMignonK Offline
      KroMignon
      wrote on last edited by
      #10

      @Zgembo Your welcome ;)

      The problem with your previous code is that QString("Tehnologije i sistemi za podršku korisnicima") will translate your string as UNICODE string not UTF-8.
      QString::fromUtf8("Tehnologije i sistemi za podršku korisnicima") will also works, but QStringLiteral() will generate the string once a compilation, so you will have better performances.
      ==> take a look at QStringLiteral explained for more details.

      It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

      ZgemboZ 1 Reply Last reply
      3
      • KroMignonK KroMignon

        @Zgembo Your welcome ;)

        The problem with your previous code is that QString("Tehnologije i sistemi za podršku korisnicima") will translate your string as UNICODE string not UTF-8.
        QString::fromUtf8("Tehnologije i sistemi za podršku korisnicima") will also works, but QStringLiteral() will generate the string once a compilation, so you will have better performances.
        ==> take a look at QStringLiteral explained for more details.

        ZgemboZ Offline
        ZgemboZ Offline
        Zgembo
        wrote on last edited by
        #11

        @KroMignon said in Compare strings with characters like "šđčćž":

        @Zgembo Your welcome ;)

        The problem with your previous code is that QString("Tehnologije i sistemi za podršku korisnicima") will translate your string as UNICODE string not UTF-8.
        QString::fromUtf8("Tehnologije i sistemi za podršku korisnicima") will also works, but QStringLiteral() will generate the string once a compilation, so you will have better performances.
        ==> take a look at QStringLiteral explained for more details.

        @KroMignon thank you for your time and detailed explanation.

        1 Reply Last reply
        0
        • Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #12

          @KroMignon said in Compare strings with characters like "šđčćž":

          will translate your string as UNICODE string not UTF-8.

          What do you mean with unicode here?
          Since Qt5 QString(const char*) will treat the char array as utf-8 but if your compiler correctly parses the source as utf-8 is another question (msvc has problems with it) therefore my recommendation is to not use anything but latin1 in the source code and do a proper translation.

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          KroMignonK 1 Reply Last reply
          1
          • Christian EhrlicherC Christian Ehrlicher

            @KroMignon said in Compare strings with characters like "šđčćž":

            will translate your string as UNICODE string not UTF-8.

            What do you mean with unicode here?
            Since Qt5 QString(const char*) will treat the char array as utf-8 but if your compiler correctly parses the source as utf-8 is another question (msvc has problems with it) therefore my recommendation is to not use anything but latin1 in the source code and do a proper translation.

            KroMignonK Offline
            KroMignonK Offline
            KroMignon
            wrote on last edited by KroMignon
            #13

            @Christian-Ehrlicher said in Compare strings with characters like "šđčćž":

            What do you mean with unicode here?

            From the QString documentation:

            QString::QString(const char *str)
            Constructs a string initialized with the 8-bit string str. The given const char pointer is converted to Unicode using the fromUtf8() function.
            You can disable this constructor by defining QT_NO_CAST_FROM_ASCII when you compile your applications. This can be useful if you want to ensure that all user-visible strings go through QObject::tr(), for example.

            It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

            1 Reply Last reply
            0
            • Christian EhrlicherC Offline
              Christian EhrlicherC Offline
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on last edited by
              #14

              @KroMignon said in Compare strings with characters like "šđčćž":

              to Unicode using the fromUtf8() function.

              So the documentation states exactly what I wrote - QStringLiteral("foo") and QString("foo") both interpret the string as utf-8 and converts it to it's internal QString representation (which is utf-16).
              The only difference is that QStringLiteral() does it at compile time and QString(const char*) at run time.

              Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
              Visit the Qt Academy at https://academy.qt.io/catalog

              KroMignonK 1 Reply Last reply
              1
              • Christian EhrlicherC Christian Ehrlicher

                @KroMignon said in Compare strings with characters like "šđčćž":

                to Unicode using the fromUtf8() function.

                So the documentation states exactly what I wrote - QStringLiteral("foo") and QString("foo") both interpret the string as utf-8 and converts it to it's internal QString representation (which is utf-16).
                The only difference is that QStringLiteral() does it at compile time and QString(const char*) at run time.

                KroMignonK Offline
                KroMignonK Offline
                KroMignon
                wrote on last edited by
                #15

                @Christian-Ehrlicher In my experience with QString, QStringLiteral(const char*) != QString(const char*) but QStringLiteral(const char*) == QString::fromUtf8(const char*).

                It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                aha_1980A 1 Reply Last reply
                0
                • KroMignonK KroMignon

                  @Christian-Ehrlicher In my experience with QString, QStringLiteral(const char*) != QString(const char*) but QStringLiteral(const char*) == QString::fromUtf8(const char*).

                  aha_1980A Offline
                  aha_1980A Offline
                  aha_1980
                  Lifetime Qt Champion
                  wrote on last edited by
                  #16

                  @KroMignon @Christian-Ehrlicher is right, it all depends on the compiler. source code is 8 bit and your compiler can treat it with any encoding it likes. if you need non-ASCII, you should encode it with the C++11 unicode literals.

                  Qt has to stay free or it will die.

                  KroMignonK 1 Reply Last reply
                  1
                  • aha_1980A aha_1980

                    @KroMignon @Christian-Ehrlicher is right, it all depends on the compiler. source code is 8 bit and your compiler can treat it with any encoding it likes. if you need non-ASCII, you should encode it with the C++11 unicode literals.

                    KroMignonK Offline
                    KroMignonK Offline
                    KroMignon
                    wrote on last edited by
                    #17

                    @aha_1980 said in Compare strings with characters like "šđčćž":

                    it all depends on the compiler.

                    @aha_1980 @Christian-Ehrlicher , I agree with you, but as I write before, when using QStringLiteral() or QString::fromUtf8() I always works like I expect it to work. I do multi-platform development (Windows XP/7, Linux ARM/x86 and Android), so there are many different compilers I have to use.
                    This was for me, the working solution.
                    I just sharing experience.

                    It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                    1 Reply Last reply
                    0
                    • fcarneyF Offline
                      fcarneyF Offline
                      fcarney
                      wrote on last edited by fcarney
                      #18

                      @Christian-Ehrlicher
                      Didn't we see this same issue with chinese symbols in the source code? How would you solve this "doing a proper translation"? How would you store the comparison strings for checking data from the database? Using tr()?

                      Is the problem here with the actual character set used to write the source code? I cannot reproduce the error, but I would like to know how to reproduce this.
                      @Zgembo
                      What compiler, editor, OS, and version of Qt are you running?
                      Do you know what the character encoding is for the source files?

                      Edit:
                      A QStringLiteral compiles a read only object in memory that stores the string. A QString would just grab the stored string that the compiler stored at compile time. Somehow that stored string is different than the string object that is generated by QStringLiteral. This is why it fails.

                      I noticed my version of Qt Creator sets its encoding to "System". I checked the encoding of the source files I have and they are Utf-8. So I would guess that other people's system have different encodings and that is where the issue is. Is this correct?

                      Also, in this case, what is the database character encoding?

                      C++ is a perfectly valid school of magic.

                      1 Reply Last reply
                      0
                      • Christian EhrlicherC Offline
                        Christian EhrlicherC Offline
                        Christian Ehrlicher
                        Lifetime Qt Champion
                        wrote on last edited by
                        #19

                        @fcarney : when you have utf-8 encoded text in your source code you have to make sure the compiler knows this. On Linux this is no problem since the default locale is utf-8 by default. On Windows you have to pass /utf-8 to the msvc compiler to be really sure.

                        With 'proper translation' I mean tr(), yes.

                        'A QStringLiteral compiles a read only object in memory that stores the string.'

                        What do you mean by 'string' here? It's stored as utf-16 so QString can access it without doing a conversion first which is faster than first creating it from an utf-8 encoded char* array.

                        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                        Visit the Qt Academy at https://academy.qt.io/catalog

                        1 Reply Last reply
                        2
                        • fcarneyF Offline
                          fcarneyF Offline
                          fcarney
                          wrote on last edited by
                          #20

                          @Christian-Ehrlicher said in Compare strings with characters like "šđčćž":

                          What do you mean by 'string' here?

                          I was trying to grasp if that the QStringLiteral stores something different than the string literal the compiler stores when creating the temporary QString object. Which would explain why QStringLiteral("šđčćž") != QString("šđčćž") on some systems. So by string I mean "šđčćž" as interpreted by the compiler as a literal. I hope I am using the right words.

                          C++ is a perfectly valid school of magic.

                          1 Reply Last reply
                          0

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved