Domanda

Come posso convertire una stringa wchar_t da maiuscole a minuscole in C ++?

La stringa contiene una combinazione di caratteri giapponesi, cinesi, tedeschi e greci.

Ho pensato di usare il towlower ...

http://msdn.microsoft.com/ it-it / library / 8h19t214% 28VS.80% 29.aspx

.. ma la documentazione dice che:

  

La conversione del case di towlower è specifica della locale. Nel caso vengono modificati solo i caratteri rilevanti per la locale corrente.

Modifica: forse dovrei descrivere cosa sto facendo. Ricevo una query di ricerca Unicode da un utente. È originariamente in codifica UTF-8, ma la sto convertendo in un widechar (potrei sbagliarmi sulla formulazione). Il mio debugger (VS2008) mostra correttamente i caratteri giapponese, tedesco, ecc. Nella & Quot; variabile quick watch & Quot ;. Devo passare attraverso un altro set di dati in Unicode e trovare corrispondenze della stringa di ricerca. Anche se questo non è un problema per me quando la ricerca fa distinzione tra maiuscole e minuscole, è più problematico farlo senza distinzione tra maiuscole e minuscole. Il mio approccio (forse ingenuo) per risolvere il problema sarebbe quello di convertire tutti i dati di input e output in minuscolo e poi confrontarli.

È stato utile?

Soluzione

Se la stringa contiene tutti quei caratteri, il set di codici deve essere basato su Unicode. Se implementato correttamente, Unicode (Capitolo 4 ' Proprietà dei caratteri ') definisce le proprietà dei caratteri, incluso se il carattere è maiuscolo e la mappatura minuscola, e così via.

Dato quel preambolo, la funzione towlower() da <wctype.h> è lo strumento corretto da usare. Se non funziona, hai un problema di QoI (Quality of Implementation) da discutere con il tuo fornitore. Se ritieni che il fornitore non risponda, consulta le librerie alternative. In questo caso, potresti prendere in considerazione ICU (International Components for Unicode).

Altri suggerimenti

Hai un brutto problema in mano. Una locale giapponese non aiuta a convertire il tedesco e viceversa. Ci sono lingue che non hanno neanche il concetto di captalization (toupper e gli amici non sarebbero qui, suppongo). Quindi, puoi spezzare la tua stringa in singoli pezzi di parole della stessa lingua? Se puoi, puoi convertire i pezzi e legarli.

Questa risposta SO mostra come lavorare con le sfaccettature per lavorare con diverse impostazioni locali. Se questo è su Windows, puoi prendere in considerazione l'uso delle funzioni dell'API win32, se puoi lavorare con C ++. NET (C ++ gestito), puoi usare le funzioni char.ToLower e string.ToLower, che sono conformi Unicode.

Dai un'occhiata a _wcslwr_l in <wchar.h> ( MSDN ).

Dovresti essere in grado di eseguire la funzione sull'input per ciascuna delle impostazioni locali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top