unicode karakters opslaan
Ik probeer unicode karaters op te slaan zoals (als ik hier tekens toon wordt het bericht afgekapt:))
in de header staat <meta charset="utf-8">
Ik gebruik <form accept-charset="utf-8">
Ik heb de tabel en veld aangepast naar utf8mb4
Code (php)
1
2
2
ALTER TABLE trn_gamecomments CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE trn_gamecomments CHANGE `comment` `comment` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
ALTER TABLE trn_gamecomments CHANGE `comment` `comment` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
De gegevens komen juist aan. Ik zie ze bij een print_r($_POST)
In de database staan ze juist (phpMyAdmin) maar na opvragen krijg ik ?
Jan
Gewijzigd op 18/10/2021 11:53:11 door Jan R
Ook al een UTF-8 header in PHP geplaatst?
Toevoeging op 18/10/2021 12:00:35:
Gewoon voor de zekerheid nog eens in het phpscript geplaatst
header('Content-Type: text/html; charset=utf-8');
Jan R op 18/10/2021 11:57:06:
Gewoon voor de zekerheid nog eens in het phpscript geplaatst
header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/html; charset=utf-8');
Wel handig als je dan ook even aangeeft of er iets is gewijzigd ... we hebben namelijk geen glazen bol ;)
Blijkbaar niet anders had ik wel iets gezegd zoals opgelost. Niet dus.
Jan R op 18/10/2021 14:41:55:
... anders had ik wel iets gezegd zoals opgelost ...
Wat jij zou hebben gezegd kunnen we uiteraard niet raden ;-)
Maar goed, nog niet opgelost dus. Dan is dat in ieder geval duidelijk.
tut al snel gescand op mogelijke issues? Bijvoorbeeld heb je de mysqli client (in PHP) in UTF8 gezet?
Sorry voor deze be'tut'eling ;-)
Heb je de Code (php)
1
2
3
4
2
3
4
<?php
$db = new mysqli($host, $account, $password, $database);
$db->set_charset('utf8mb4');
?>
$db = new mysqli($host, $account, $password, $database);
$db->set_charset('utf8mb4');
?>
Sorry voor deze be'tut'eling ;-)
Ad Fundum op 18/10/2021 20:08:31:
Heb je de tut al snel gescand op mogelijke issues? Bijvoorbeeld heb je de mysqli client (in PHP) in UTF8 gezet?
Ook niet gelukt. Zelfs de totale db omgezet naar utf8mb4 hielp niet. Toch zou het mogelijk moeten zijn want staat juist in phpMyAdmin
Toevoeging op 19/10/2021 06:09:09:
Bij de export van phpMyAdmin staat alles OK
https://www.janr.be/sql/sql.sql
Na de import nog steeds OK in phpMyAdmin
Toevoeging op 19/10/2021 06:23:44:
Extra info:
Mijn data komt van 4 tabellen waarvan 1 dubbel dus 5.
Als ik enkel de tabel met smileys opvraag dan krijg ik per smiley 3 ruitjes met een vraagteken
Gewijzigd op 19/10/2021 07:00:25 door Jan R
Want die is sluitend, als je alles volgt heb je geen problemen met die vraagtekens.
Dus dan nog een andere 'educated guess': snapt je browser dat-ie UTF-8 ontvangt? Die meta tag is alleen handig voor HTML-bestanden die op zichzelf staan. Als je ze via een webserver aanbiedt dan kan je beter de goede HTTP header meegeven.
Code (php)
1
2
3
2
3
<?php
header('Content-Type: text/html; charset=utf-8'); /** @link http://www.w3.org/International/O-HTTP-charset */
?>
header('Content-Type: text/html; charset=utf-8'); /** @link http://www.w3.org/International/O-HTTP-charset */
?>
Controleer ook of je webserver niet stiekum een andere encoding meestuurt, bijvoorbeeld via de developertools in de browser (F12).
Toevoeging op 19/10/2021 09:25:32:
- Ariën - op 18/10/2021 20:46:27:
Waar is hij eigenlijk?
Hij doet het rustiger aan nadat hij hier onjuiste dingen ging beweringen.
Zo heel af en toe heb ik nog wel een post van Thomas gezien.
Bewaar je comment voortaan als base64 en decode het weer in PHP
Met gebruik van je demo database, voer deze queries uit
Code (php)
1
2
3
2
3
UPDATE trn_gamecomments SET comment = TO_BASE64(comment);
SELECT * FROM trn_gamecomments;
SELECT *, FROM_BASE64(comment) FROM trn_gamecomments;
SELECT * FROM trn_gamecomments;
SELECT *, FROM_BASE64(comment) FROM trn_gamecomments;
Database ziet er dan zo uit :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- Adminer 4.8.1 MySQL 5.5.5-10.3.29-MariaDB dump
SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
SET NAMES utf8mb4;
DROP TABLE IF EXISTS `trn_gamecomments`;
CREATE TABLE `trn_gamecomments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`gameid` int(11) NOT NULL,
`w_b` enum('white','black') COLLATE utf8mb4_unicode_ci NOT NULL,
`comment` text COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `gameid` (`gameid`,`w_b`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `trn_gamecomments` (`id`, `gameid`, `w_b`, `comment`) VALUES
(1, 4145, 'white', 'V2l0'),
(2, 4145, 'black', 'WndhcnQ='),
(38, 3876, 'black', 'TWlqbiB2ZXJzbGFnIG1ldCBbYl1ib2xkWy9iXSBlbiBbaV1pdGFsaWNbL2ldIGthcmFrdGVycw0K\nOikgOnAgOigNCvCfmJgJ8J+YmQnwn5iaCfCfmJsJ8J+YnAnwn5idCfCfmJ4J8J+Ynw==');
-- 2021-10-19 07:57:27
SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
SET NAMES utf8mb4;
DROP TABLE IF EXISTS `trn_gamecomments`;
CREATE TABLE `trn_gamecomments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`gameid` int(11) NOT NULL,
`w_b` enum('white','black') COLLATE utf8mb4_unicode_ci NOT NULL,
`comment` text COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `gameid` (`gameid`,`w_b`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `trn_gamecomments` (`id`, `gameid`, `w_b`, `comment`) VALUES
(1, 4145, 'white', 'V2l0'),
(2, 4145, 'black', 'WndhcnQ='),
(38, 3876, 'black', 'TWlqbiB2ZXJzbGFnIG1ldCBbYl1ib2xkWy9iXSBlbiBbaV1pdGFsaWNbL2ldIGthcmFrdGVycw0K\nOikgOnAgOigNCvCfmJgJ8J+YmQnwn5iaCfCfmJsJ8J+YnAnwn5idCfCfmJ4J8J+Ynw==');
-- 2021-10-19 07:57:27
Dan in HTML/PHP :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Emojis uit database</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
$db = new mysqli(localhost, 'user', 'password', 'database');
$query = 'SELECT * FROM trn_gamecomments WHERE id = 38;';
$result = $db->query($query);
$row = $result->fetch_object();
echo '<pre>' . print_r( $row, TRUE ) . '</pre>';
echo $row->comment . '<br />';
echo base64_decode($row->comment);
?>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Emojis uit database</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
$db = new mysqli(localhost, 'user', 'password', 'database');
$query = 'SELECT * FROM trn_gamecomments WHERE id = 38;';
$result = $db->query($query);
$row = $result->fetch_object();
echo '<pre>' . print_r( $row, TRUE ) . '</pre>';
echo $row->comment . '<br />';
echo base64_decode($row->comment);
?>
</body>
</html>
Bij een INSERT doe je in PHP base64_encode($comment)
Gewijzigd op 19/10/2021 10:28:10 door Adoptive Solution
Wel nog een stripslashes toegevoegd. Je weet maar nooit :)
utf8mb4 is dan ook niet meer nodig en utf8_unicode_ci kan dus blijven. tenzij er een reden is om over te stappen naar utf8mb4?
Voor mij was de tabel update niet nodig. Die 3 testlijntjes kan ik wel opnieuw schrijven en in productie kent niemand deze functie. Nog niet:)
Jan
Waarom zou je die aan de kant willen zetten?
PS je moet zelf eens testen op phphulp om een bericht MET eomji's te posten
Je weet altijd waar je aan toe bent met CHAR, geen lastige lengtes meer, je maakt alles gewoon ASCII.
En als je zeker wilt weten dat al die geinige lachebekjes doorkomen op je browser, doe je eenvoudig base64_encode(htmlentities($emoji)) voordat je het opslaat, succes gegarandeerd.
En het allermooiste is: met slechts twee functies en ASCII kan je echt alles, je hoeft geen enkele tutorial te lezen. Simpeler kan het niet.