Vraagtekens in e-mail voor tekens zoals niet-afbrekende ruimte. Het gebeurt alleen op Unix en niet op Windows

Ik sta voor een vreemd probleem met betrekking tot inhoudstype/codering. Hier is mijn Java-codefragment hieronder. Deze code werkt perfect op een Windows-computer waarop de toepassingsserver wordt uitgevoerd op vensters en de SMTP -server voor het verzenden van e-mails is ook Windows localhost. Wanneer ik dezelfde code op een Unix-server implementeer, bevat de e-mail die voor exact dezelfde inhoud wordt verzonden vraagtekens (???) voor speciale tekens, zoals niet-brekende witruimte.

Ik heb veel googled, maar ik heb geen oplossing gevonden. Hoe kan ik dit probleem oplossen? De inhoudstypen die ik heb geprobeerd, waren ISO-8859-1 , UTF-8 en Windows-1252 . Niets helpt.

        MimeMessage message = new MimeMessage(session);
                .............

        Multipart mp = new MimeMultipart();
        MimeBodyPart messageBody = new MimeBodyPart();
        messageBody.setContent(mailMessage, "text/html;charset=Windows-1252");
        messageBody.setHeader("Content-Type", "text/html;charset=Windows-1252");

       //Add body to the multimedia part
        mp.addBodyPart(messageBody);
        message.setContent(mp);

       //Send message
        Transport.send(message);
1
Verschillen de gegenereerde berichten en/of gebruikt u een andere e-mailclient om de berichten te bekijken? Mijn gok is dat je Unix MUA de ondersteuning voor UTF8 mist, of je gebruikt het met de verkeerde locale instellingen.
toegevoegd de auteur tripleee, de bron
Ik bedoel, als je de berichten (hun "bron" in het moderne e-mailverklaringsprogramma) anders maakt, hoe verschillen ze dan? Als Outlook ze anders weergeeft, moeten er significante verschillen zijn, waarschijnlijk in de Content- * headers.
toegevoegd de auteur tripleee, de bron
@tripleee, ik gebruik dezelfde e-mailclient die Microsoft Outlook op mijn laptop heeft om deze e-mails te ontvangen. Het gegenereerde bericht is ook hetzelfde qua inhoud.
toegevoegd de auteur jayP, de bron
@tripleee, het verschil is dat ik het krijg ?? voor die personages wanneer ik de html-bron zie van de e-mail die ik ontvang. Het maakt dus niet uit wat het inhoudstype wordt verzonden als metatitel in html, vraagtekens zijn altijd vraagtekens. Het is iets aan de unix-kant dat ervoor zorgt dat die speciale tekens (niet-verbreekbare ruimte) als vraagtekens over e-mailberichten worden verzonden.
toegevoegd de auteur jayP, de bron

2 antwoord

Gebruikt u in beide gevallen dezelfde mailserver? En hetzelfde clientprogramma om het bericht te bekijken?

Voer voor foutopsporing, net voor de oproep Transport.send, het volgende in:

message.writeTo(new FileOutputStream("msg.txt"));

en bekijk vervolgens het bestand msg.txt om te zien of de tekens correct zijn gecodeerd.

Hoe creëer je de tekst in de mailMessage String? Als je de string niet maakt met de juiste Unicode-tekens, zal geen enkele charset het goed maken.

Ook hoeft u de kop van het Content-type nooit expliciet in te stellen, verwijder die regel.

En, in plaats van setContent, gebruik:

messageBody.setText(mailMessage, "html", "utf-8");

Dat zorgt ervoor dat de Content-Type header correct is ingesteld en dat de parameters (bijv. Charset) correct zijn geciteerd.

2
toegevoegd
Is de header Content-Type van de e-mail het ook niet eens met de header HTTP-Equivs in de HTML-payload?
toegevoegd de auteur tripleee, de bron
Krijgt u dus onreine tekst uit uw databaseverbinding? Waar is de database actief en hoe hecht je eraan?
toegevoegd de auteur tripleee, de bron
Als u vraagtekens in het bestand msg.txt krijgt, is er iets fundamentelers mis. Het suggereert dat de vraagtekens in de originele reeks staan. Welke niet-ASCII-gegevens heeft u in de oorspronkelijke reeks en hoe heeft u de oorspronkelijke reeks gemaakt? Als u alleen de originele reeks naar een bestand schrijft, wat krijgt u dan?
toegevoegd de auteur Bill Shannon, de bron
De gegevens in de database gebruiken mogelijk de standaard tekenset voor uw besturingssysteem (in plaats van utf-8) en worden mogelijk niet correct geconverteerd naar Unicode-tekens bij het samenstellen van een Java String-object uit de tekens in de database. Dat is waarom, wanneer u de string naar een bestand schrijft, u deze kunt bekijken in Kladblok; Notepad gebruikt de standaard tekenset. Kijk naar de integerwaarde van elk teken in uw Java-tekenreeks om te controleren of dit de verwachte Unicode-tekens zijn, met name voor het niet-brekende spatieteken.
toegevoegd de auteur Bill Shannon, de bron
Bedankt @ Bill Shannon dat je mijn veel tijd hebt bespaard. string.setText werkte voor mij
toegevoegd de auteur Ajay Kurmi, de bron
ik schreef het txt-bestand zoals je had voorgesteld. Het heeft ook de vraagtekens (???) en dit is wat het heeft: <html> <head> <meta http-equiv = "Content-Type" content = "text/html; charset = ISO-8859-1" /> Ik heb je setText-methode geprobeerd. Het lost het probleem ook niet op. Het bericht heeft de juiste tekens omdat dezelfde instelling/code werkt op vensters (wanneer alles op vensters staat)
toegevoegd de auteur jayP, de bron
negeer alstublieft de html-code die ik hierboven heb geplakt. Dat is een deel van het bericht en heeft het inhoudstype daar hard gecodeerd.
toegevoegd de auteur jayP, de bron
de karakters komen van de gegevens in mijn database. En de gegevens zien er goed uit. De personages zijn eigenlijk niet-brekende ruimte (dat is wat ze het noemen). als ik die reeks open in blocnote op mijn machine, toont het behoorlijk.
toegevoegd de auteur jayP, de bron

Uiteindelijk moest ik gaan met een ruwe manier om het te doen. Ik heb dergelijke tekens vervangen door ruimte.

mailMessage.replaceAll("[^\\x20-\\x7e]", " ");

Alle speciale tekens, zoals een niet-afbrekende spatie of een ander teken dat buiten het normale bereik valt, worden vervangen door ruimte. De e-mail in dit geval was hoe dan ook bedoeld voor normale tekst.

2
toegevoegd