Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
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


Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
HONOR 500 Pro, scheda tecnica confermata...
GeForce NOW si prepara a vivere un mese ...
Exynos 2600: temperature più bass...
Apple si ispirerà a Nothing? Back...
Da Intel ad AMD, il grande salto di Kulk...
Velocità 12 volte superiore a que...
Una piccola Morte Nera è gi&agrav...
Sei frodi che minacciano gli utenti nel ...
BioShock 4: Take-Two rassicura sullo svi...
Tesla, Musk promette FSD 'quasi pronto' ...
BioWare conferma: il nuovo Mass Effect &...
5 robot aspirapolvere di fascia alta in ...
Xiaomi Redmi Note 14 5G a 179€ è ...
Veri affari con gli sconti de 15% Amazon...
Tutti gli iPhone 16 128GB a 699€, 16e a ...
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: 04:22.


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