Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
DEEBOT T90 PRO OMNI abbina un sistema di aspirazione basato su tecnologia BLAST ad un rullo di lavaggio dei pavimenti dalla larghezza elevata, capace di trattare al meglio le superfici di casa minimizzando i tempi di lavoro. Un robot completo che riesce anche ad essere sottile e garantire automazione ed efficienza nelle operazioni di pulizia di casa
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Per diversi giorni il Galaxy S26 Ultra di Samsung è stato il nostro compagno di vita. Oltre alle conferme del colosso coreano come la qualità del display e una suite AI senza rivali, arriva il Privacy Display, un unicum nel mondo smartphone. Ci sono ancora alcuni gap che non sono riusciti a colmare lato batteria e fotocamera, seppur con alcuni miglioramenti.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-04-2009, 19:52   #1
limpid-sky
Senior Member
 
L'Avatar di limpid-sky
 
Iscritto dal: Aug 2004
Messaggi: 1703
[C++]Sostituzione di parole accentate. Perchè non funziona?

Salve,
stavo sperimentando con la classe string ma non riesco a capire perchè questa funzione presa da "Practical programming" di bruce Eckel non funziona.
Faccio leggere un file contenente delle frasi e deve sostituirmi "è caldo" con "is hot";
Non accade nulla perchè non riesce a leggere la "è" e quindi non sostituisce tutto.
Funziona invece per altre stringhe.
Se possibile non vorrei copiare l'oggetto string in un array.


Codice:
#include <iostream>
#include <fstream>
#include <string>
#include "ReplaceAll.h"

using namespace std;

int main()
{

ifstream ingresso("in.txt");
string s;
string temp;
while (getline(ingresso, s))
{
    cout<<s;
    temp=temp+s;

    }

ingresso.close();


replaceAll(temp,"è caldo","is hot");
ofstream uscita("exit.txt");
uscita<<temp;

uscita.close();

    system ("pause");
    return 0;
}


Codice:
//: C03:ReplaceAll.cpp {O}
//#include <cstddef>
#include "ReplaceAll.h"
using namespace std;

string& replaceAll(string& context, const string& from, const string& to)
{
size_t lookHere = 0;
size_t foundHere;

    while((foundHere = context.find(from, lookHere))!= string::npos)
    {
    context.replace(foundHere, from.size(), to);
    lookHere = foundHere + to.size();
    }
return context;
} ///:~
Codice:
#include <string>

std::string& replaceAll(std::string& context,
const std::string& from, const std::string& to);

Ultima modifica di limpid-sky : 20-04-2009 alle 19:59.
limpid-sky è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2009, 20:32   #2
limpid-sky
Senior Member
 
L'Avatar di limpid-sky
 
Iscritto dal: Aug 2004
Messaggi: 1703
sembra essere un problema legato a unicode. ma come posso fare per risolverlo?
poichè in inglese le lettere accentate non ci sono quella funzione va bene per l'inglese ma non per l'italiano.
limpid-sky è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2009, 22:03   #3
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da limpid-sky Guarda i messaggi
sembra essere un problema legato a unicode. ma come posso fare per risolverlo?
salvando il txt in formato ANSI
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 01:12   #4
limpid-sky
Senior Member
 
L'Avatar di limpid-sky
 
Iscritto dal: Aug 2004
Messaggi: 1703
Quote:
Originariamente inviato da 71104 Guarda i messaggi
salvando il txt in formato ANSI
Grazie di aver risposto.
sono ignorante come si fa?
o almeno indicami dove vedere.
Per salvare correttamente secondo in ANSI come devo fare?.

Ultima modifica di limpid-sky : 21-04-2009 alle 02:33.
limpid-sky è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 11:14   #5
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da limpid-sky Guarda i messaggi
Grazie di aver risposto.
sono ignorante come si fa?
o almeno indicami dove vedere.
Per salvare correttamente secondo in ANSI come devo fare?.
aprilo con Blocco Note, scegli "Save As..." dal menu File e nella casella "Encoding" seleziona "ANSI".
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 11:34   #6
limpid-sky
Senior Member
 
L'Avatar di limpid-sky
 
Iscritto dal: Aug 2004
Messaggi: 1703
Ah intendevi questo.
Per crearlo in questo modo dal terminale del C++ non esiste nulla?

Ultima modifica di limpid-sky : 21-04-2009 alle 11:41.
limpid-sky è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 11:54   #7
limpid-sky
Senior Member
 
L'Avatar di limpid-sky
 
Iscritto dal: Aug 2004
Messaggi: 1703
come posso fargli sostituire ste benedette parole accentate.
Sto impazzendo.
limpid-sky è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 13:20   #8
limpid-sky
Senior Member
 
L'Avatar di limpid-sky
 
Iscritto dal: Aug 2004
Messaggi: 1703
Forse usando visual c++ e qualche libreria di windows si può fare più rapidamente?
Volevo capire il perchè questo sistema non funziona. Cioè non riesco a capire perchè non legge il carattere "è". Da quello che ho capito sbattendoci la testa fino ad ora è che il carattere "è" non è contenuto nell'ascii standard ma in quello esteso. Essendo il file del blocco note scritto in Ansi forse c'è una relazione tra le due cose.

Una possibile soluzione sarebbe passare per il C.
Copiare una riga dal file in una stringa del C.
vedere carattere per carattere se trova il carattere "è"
Se lo trova sostituirlo con una coppia di caratteri "is"
Ricalcolare la lunghezza della stringa e shiftare tutto.
Insomma una bella porcata.
limpid-sky è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 21:40   #9
limpid-sky
Senior Member
 
L'Avatar di limpid-sky
 
Iscritto dal: Aug 2004
Messaggi: 1703
UP
Un indicazione?
limpid-sky è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 17:24   #10
limpid-sky
Senior Member
 
L'Avatar di limpid-sky
 
Iscritto dal: Aug 2004
Messaggi: 1703
nessuna soluzione?
limpid-sky è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 23:50   #11
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da limpid-sky Guarda i messaggi
nessuna soluzione?
Come hai creato il documento "in.txt"?
Se è in formato UTF8 (e assai probabilmente lo è altrimenti il tuo codice doveva funzionare) dovrai usare MultiByteToWideChar usando come code page CP_UTF8 e usare wchar_t e derivati oppure iconv sotto Linux.

Altrimenti dovresti usare setlocale ma a quanto mi risulta nessun Visual Studio può impostare l'UTF8 come locale (solo VS2003 apparentemente ci riusciva ma era solamente un bug, che dovevano risolvere in VS2005, ma che è ancora prensente in VS2008...), non mi è mai capitato il problema sotto linux perciò non saprei se un setlocale(".65000") è sufficiente.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2009, 09:39   #12
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Al limite puoi appoggiarti a wcstombs() per la conversione UTF-8 → ANSI e mbstowcs() per la conversione ANSI → UTF-8, mi sembra che sia standard per il C99.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2009, 13:15   #13
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Al limite puoi appoggiarti a wcstombs() per la conversione UTF-8 → ANSI e mbstowcs() per la conversione ANSI → UTF-8, mi sembra che sia standard per il C99.
La faccenda è più complicata: wcstombs/mbstowcs convertono da e verso UCS-2, per usare i codepage c'è bisogno di affidarsi a librerie non incluse nello standard (C e C++).
Anche boost ha qualche classe per la gestione dell'utf8 ma non l'ho mai usata.

Nel caso in questione la conversione deve essere molto probabilmente da UTF-8 a Windows-1252 (o ISO-8859-15)
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2009, 13:24   #14
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
non si fa prima a risalvare il file txt?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2009, 13:54   #15
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da tomminno Guarda i messaggi
La faccenda è più complicata: wcstombs/mbstowcs convertono da e verso UCS-2, per usare i codepage c'è bisogno di affidarsi a librerie non incluse nello standard (C e C++).
Anche boost ha qualche classe per la gestione dell'utf8 ma non l'ho mai usata.

Nel caso in questione la conversione deve essere molto probabilmente da UTF-8 a Windows-1252 (o ISO-8859-15)
Hmm, sei sicuro? Non riesco a trovare nessuna informazione che confermi, ma nemmeno che smentisca.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2009, 15:03   #16
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Hmm, sei sicuro? Non riesco a trovare nessuna informazione che confermi, ma nemmeno che smentisca.
Direi sicuro al 99.9%.
Il problema dei Code Page è decisamente una delle cose per cui il C++ fornisce scarsissimo supporto, supporto invece fornito semplicissimamente dal .NET (tra l'altro a vedere il codice della classe Encoding direi che hanno fatto il porting di qualcosa scritto in C, visto che è pieno di puntatori e goto).
Sono queste le cose che fanno apprezzare un linguaggio con una grossa libreria standard altro che la gestione automatica della memoria...

Comunque dicevo wcstombs/mbstowcs utilizzano per le conversioni il codepage definito nel programma tramite le apposite funzioni C/C++ (locale/setlocale).
Il problema è che per l'appunto i compilatori Microsoft non sono in grado di impostare come Code Page l'UTF8 e quindi le funzioni standard non possono essere usate (non conosco altrettanto bene altri compilatori per Windows, ho usato il compilatore Intel solo per applicazioni scientifiche dove non c'erano di questi problemi).

Invece le funzioni del sistema operativo (MultiByteToWideChar/WideCharToMultiByte) consentono di specificare un code page specifico per le conversioni.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2009, 15:11   #17
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da 71104 Guarda i messaggi
non si fa prima a risalvare il file txt?
Quello sicuramente.
Ma metti che (non so se questo è il caso) il programma debba elaborare file scritti da un applicativo .NET (che di default usa UTF8), o modifichi il programma .NET per fargli scrivere in un code page differente o devi adattare la lettura
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2009, 17:40   #18
limpid-sky
Senior Member
 
L'Avatar di limpid-sky
 
Iscritto dal: Aug 2004
Messaggi: 1703
Ma il file txt di origine viene generato dal programma in c++ con l'istruzione ofstream quindi non so come lo salva.

Vi dico quello che il programma fa. Apre un file html ne fa il parsing e ne estrae il testo che viene salvato in un file con l'istruzione ofstream. A partire da questo file che viene riaperto il lettura vengono sostituite delle stinghe contenenti la "è" con stringhe in inglese. Tutto qua.
Ho anche provato a fare un file in txt e salvare in ansi ma il problema si presenta lo stesso e le stringhe contententi "è" non vengono sostituite.
Per esempio non viene sostituita la stringa "domani è" "con tomorrow is".
Forse ora è + più chiaro.
limpid-sky è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2009, 17:51   #19
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da limpid-sky Guarda i messaggi
Vi dico quello che il programma fa. Apre un file html ne fa il parsing e ne estrae il testo che viene salvato in un file con l'istruzione ofstream. A partire da questo file che viene riaperto il lettura vengono sostituite delle stinghe contenenti la "è" con stringhe in inglese. Tutto qua.
E il file html da dove viene? Potrebbe aver benissimo essere specificato un encoding UTF8.

Hai guardato in debug cosa vedi al posto dei caratteri accentati quando leggi l'html?

Quote:
Ho anche provato a fare un file in txt e salvare in ansi ma il problema si presenta lo stesso e le stringhe contententi "è" non vengono sostituite.
Per esempio non viene sostituita la stringa "domani è" "con tomorrow is".
Forse ora è + più chiaro.
Questo è strano io ho provato il codice che hai postato te e funziona con caratteri accentati, se il file non è UTF8.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2009, 17:56   #20
limpid-sky
Senior Member
 
L'Avatar di limpid-sky
 
Iscritto dal: Aug 2004
Messaggi: 1703
non so usare bene tutti gli strumenti e le mie conoscenze non sono così approfondite. cmq se riesco cerco di postarvi il codice o il file da cui vorrei leggere.
In visual c++ ho realizzato questo.
Praticamente è un programmino che legge la chat di gioco digitale in formato html e ne estrae il testo in html salvandolo in un file .
http://support.microsoft.com/kb/249232

Da questo file poi volevo farmi un programmino a console con codeblocks che traduca frasi del tipo "Il river è" con "***RIVER***" oppure "Il flop è:" con "***FLOP***"

Ultima modifica di limpid-sky : 23-04-2009 alle 17:58.
limpid-sky è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
NVIDIA RTX PRO 4500 Server Edition: la s...
Core Ultra 200 HX Plus: Intel mette il t...
Starfield arriva su PS5: data ufficiale,...
iPad Air 13" (M4) scende di prezzo: -100...
Oracle annuncia Java 26 con il Java Veri...
OPPO Find N6 è ufficiale: sottile...
Influencer sotto controllo Agcom: arriva...
Scontro in OpenAI sul ChatGPT per adulti...
Apple Watch Series 11 a 349€ e altri int...
Starlink rinnova i piani residenziali in...
POCO X8 Pro e Pro Max ufficiali: potenza...
Jensen Huang propone i token come nuovo ...
Realme 16 Pro e 16 Pro+ tra i più...
Dall'enciclopedia all'algoritmo: Encyclo...
Il CEO di Epic Games Tim Sweeney ha comp...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:54.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v