I have a Rails application that allows users to import information from various sources using RSS feeds and such. My default encoding on the database is UTF8 and I've been receiving a lot of exceptions in regards to non-UTF8 data that is coming through the system and crashing once it hits the database.
I'm to appropriately detect the non-UTF8 data using the is_utf8? method on the attributes before a save is done, but I haven't come up with a way to handle it. I've seen iconv to convert but it appears that requires being able to determine what kind of encoding I'm converting from.
Is there a simple way to do a guess conversion or possibly just strip out the non-UTF8 characters and then do the save into the database?
Thanks!
How is non-UTF-8 data making it into the system? Make sure all your pages are served as Content-Type text/html;charset=utf-8 and browsers will always submit UTF-8 data to your forms.
(Of course that still leaves things like mail and uploaded files, but a lot of those kinds of specific context often give you an encoding to go on.)
Iconv is your friend when it comes to switch encodings. To detect encodings there's a little gem available: rchardet We have used it to detect Asian encodings in an attempt to block spam and it worked fine.
Related
I tried using Feedjira to assist with content analysis from newsfeeds, but it appears that RSS feeds now only link to content rather than including them with RSS as I found out in "Feedjira not adding content and author". I plan to use Feedjira to get the URL for the article, but then use Nokogiri to scrape the article and pick out the relevant parts.
The problem is that each media outlet will have a different format for their pages and I need to know the best way for Nokogiri to take the URL from the database (supplied by Feedjira) and depending on the associated feed title (also the database from Feedjira sync) scrape the page in a specific way and save it to a separate table in the database. Anyone got any suggestions?
I don't know your special use case but I'm also doing content analysis using news feeds.
Maybe you'll have a look on Readability which provides you a generic content scraper.
The problem you've encountered is that every feed generator does it a bit differently, just as with HTML generators. You can assume certain fields are going to be in place in an RDF, RSS or ATOM feed, however the author of the feed could use optional tags that you could find very useful, so you have to write code to look for them.
I wrote several feed aggregators in the past, including one that was handling well over 1000 feeds daily. By sniffing out the feed type, ATOM vs. RSS vs RDF, then I could make sensible checks for fields that were interesting given that format, and extract the data if it was available.
Pre-canned parsers get it wrong too often, either grabbing data you don't want and making a mess of the output, or skipping data you do want leaving gaps in the output, so be prepared to write code if you want it done correctly.
You'll probably want to take advantage of a backing database too, to keep track of what you looked at last and when you're supposed to look at it again; That's part of being a good network citizen. You'll also want to keep track whether a feed was down the last n times you looked so you can trim out dead sites.
This is my first time running into such issue so if m not thorough enough I apologize for that.The project I have requires me to store data in French language, initially the encoding was set to utf-8 in database.yml however when I try and change that to latin 1 I get an error saying:
PG::InvalidParameterValue: ERROR: encoding "LATIN1" does not match locale "en_US.UTF-8"
The data that is stored in the utf-8 encoded database is in the form of broken special characters and not in the form of the actual foreign accented letters, I have googled a lot but have found solutions like recreating the template1 database with new encoding.
I want to ask the following points:
How will recreating template1 database effect my existing databases on that template with utf-8 encoding (in case I want to retain all those as well).
Is there a way to create an additional template databases (apart from template0, template1) as I dont want to lose the existing en_US.utf-8 databases on that template.
Also is this the right approach or is there any other way this can be achieved. I have been stuck on this issue for quite a while now.
Any sort of help will be hugely appreciated. Thanks a lot.
Also I would like to know if by any way can we specify encoding/charset for a specific schema inside db template1.
Per comment discussion it sounds like your DB is in UTF-8, i.e. SHOW server_encoding or SELECT current_setting('server_encoding') returns utf-8.
If so, you should leave your encoding in database.yml as utf-8 (or unspecified which should I think mean that it uses the server encoding).
Then you should use UTF-8 throughout your application. Run your application in a UTF-8 locale to ensure your collations are correct.
When dealing with web browers that request non-UTF-8 encodings, you can and should decode their responses into UTF-8, and when you're sending data to the browser, you should transform it from UTF-8 into the browser's requested encoding. The browser tells you what encoding it wants in its HTTP headers.
Most (all?) browsers support UTF-8, though, so instead you can tell the browser to decode your pages as UTF-8 and to send all GET/POST requests to you in UTF-8 too, using headers like Accept-Charset and the charset option of Content-Type, e.g. Content-Type: text/html; charset=UTF-8. This is what I suggest doing.
I don't know the specifics of how Rails does encodings/charsets, as I work on the database side, but that should get you started. This answer is about a pretty old Rails version, but mentions setting config.encoding in config/application.rb. You'll also need to make sure your Ruby files are marked as UTF-8 with #encoding: utf-8 if they actually incorporate text outside the 7-bit ASCII range.
Try to avoid setting HTTP headers directly and doing direct encoding/decoding. The framework should have a way to do that for you. Find it and use it. Then use utf-8 throughout the application and database.
What's the proper way to handle unicode characters in an iOS app that calls the foursquare API?
Our current setup calls the foursquare API from our iOS app, and returns XML (yes, we're changing this to JSON).
While testing our app, we discovered the hard way that this foursquare location borked our app -- apparently because we did not setup to handle the two Emoji characters in the venue name.
What's the proper way to handle unicode characters at each level?
In Objective-C, as we call the foursquare API?
In our our WCF web services, as we return XML data to the app?
In SQL Server 2008, as we store a place name that may contain unicode characters?
On the database side, I know that we need to make some changes to the Collation settings, among other things.
What changes, if any, are needed to support unicode 6.1 correctly in our iOS app and web services?
Thanks!
I'm guessing you are trying to convert a unicode string to another encoding then back to unicode. If the converter doesn't know what the unicode character is then it could do something strange(e.g. the converter might convert one of the new sad pussycat emoji characters to a square root sign).
This might happen without you explicitly doing it depending on how you have your database setup, the XML encoding you use, your HTTP server configuration, etc.
Unicode 6.1 just adds characters, the encoding is exactly the same(i.e. some codes that didn't map to anything now map to things).
I've encountered an interesting solution to importing/exporting data through email. This particular solution doesn't involve attaching any files and also "encrypts" the information, such that it's not easy to decipher.
I'd like to know if anyone has an idea about how this is done.
Basically, this app allows you to export a custom-selected set of data by emailing you a link. The link is a URL scheme that opens the app and asks if you want to import the data. The data looks like it's encrypted, but I'm not sure. Below is an example of a link that the app generates. Does anyone know how this is accomplished?
Thank you!:
appofinterest://#;;bmFtZQ==;TmV3IFByb2ZpbGU=;;cHJvZmlsZVBob3Rv;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;;c3R5bGU=;MA==;;dXNlc1NJVW5pdHM=;MA==;;QXBwb2ludG1lbnQ=;;ZGF0ZU9m;MjAxMi0wMS0xNSAxMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;NTY=;;dGVzdFR5cGU=;VGVtcGVyYXR1cmU=;;ZGF0ZU9mVGVzdA==;MjAxMS0xMi0xMyAwMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;NzQ=;;dGVzdFR5cGU=;VGVtcGVyYXR1cmU=;;ZGF0ZU9mVGVzdA==;MjAxMS0xMi0yOSAwMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;MzUgwrBD;;dGVzdFR5cGU=;VGVtcGVyYXR1cmU=;;ZGF0ZU9mVGVzdA==;MjAxMS0xMS0xMCAwMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;ODU=;;dGVzdFR5cGU=;VGVtcGVyYXR1cmU=;;ZGF0ZU9mVGVzdA==;MjAxMi0wMS0wMyAwMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;NjQ=;;dGVzdFR5cGU=;VGVtcGVyYXR1cmU=;;ZGF0ZU9mVGVzdA==;MjAxMS0xMS0xMCAwMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;NDYgbmcvbWw=;;dGVzdFR5cGU=;UHJvc3RhdGUgU3BlY2lmaWMgQW50aWdlbiAoUFNBKQ==;;ZGF0ZU9mVGVzdA==;MjAxMS0xMC0xMCAwMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;NjM=;;dGVzdFR5cGU=;VGVtcGVyYXR1cmU=;;ZGF0ZU9mVGVzdA==;MjAxMi0wMS0wNiAwMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;NTg=;;dGVzdFR5cGU=;VGVtcGVyYXR1cmU=;;ZGF0ZU9mVGVzdA==;MjAxMS0xMi0xMyAwMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;OTQ=;;dGVzdFR5cGU=;VGVtcGVyYXR1cmU=;;ZGF0ZU9mVGVzdA==;MjAxMS0xMi0yMiAwMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;NTk=;;dGVzdFR5cGU=;VGVtcGVyYXR1cmU=;;ZGF0ZU9mVGVzdA==;MjAxMS0xMC0xMCAwMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;OTkuOCDCsEY=;;dGVzdFR5cGU=;VGVtcGVyYXR1cmU=;;ZGF0ZU9mVGVzdA==;MjAxMS0xMi0xMCAwMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;NjU=;;dGVzdFR5cGU=;VGVtcGVyYXR1cmU=;;ZGF0ZU9mVGVzdA==;MjAxMS0wNy0xMCAwMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;OTc=;;dGVzdFR5cGU=;VGVtcGVyYXR1cmU=;;ZGF0ZU9mVGVzdA==;MjAxMS0wNy0xNSAwMDowMA==;;TGFiUmVzdWx0;;cmVzdWx0;MzIgwrBD;;dGVzdFR5cGU=;VGVtcGVyYXR1cmU=;;ZGF0ZU9mVGVzdA==;MjAxMi0wMS0wNSAwMDowMA==;;TWVkaWNhdGlvbg==;;ZnJlcXVlbmN5;b25jZSBwZXIgZGF5IChxLmQuKQ==;;cm91dGU=;SW50cmF2ZW5vdXMgKEkuVi4p;;ZHJ1Z05hbWU=;TXR4;;aXNDaGVtb0RydWc=;WWVz;;dG90YWxMaWZldGltZURvc2U=;ODUgbWc=;;c3RhcnREYXRl;MjAxMi0wMS0xNSAwMDowMA==;;c3RvcERhdGU=;MjAxMi0wNS0xMCAwMDowMA==
You could just convert your data to base64 (which is the case here*). Remember that URI are not (practically) unlimited in length and might, like the link you posted, be a little meaningless for your users.
(*) in the case you posted, the data is separated by semi-columns, for example "TmV3IFByb2ZpbGU=" is base64 for New Profile, and the big chunk in the middle is a base64 encoded PNG. Absolutely not secure - since it's not encrypted in any way, but could be fairly easily
I want to generate QR codes in ruby on rails, to run in the background of my website written in rails. Saw this http://code.google.com/p/qrcode-rails/ but cannot work out how I could get this to work for me. Basically in RoR I want to:
Pass a generator a string, my unique code, a 20 character length number (e.g. 32032928889998887776) and have an image generated with the name 'code'_qr.jpg and saved in a resource folder to be attached to an email that my program will send out.
How would I do this, does anyone know?
And while I'm asking (not so important that I get this answer now) but how would I implement QR code reading in, to get that code back, from a web cam? Thanks.
If you just need to write the data from the URL to a file, you can open up a stream, read from the file, and simply write the data to disk -- just remember to use the same extension (.jpg in this instance.)
Note that you could also simply send the link in the email (or post it as an inline image in the email.) If you really, really want to write it to disk and send it as attachment in your production system, the first-class solution for Ruby image processing is ruby-vips or ImageMagick.
Finally, since it's a disk operation, you're going to want to do it outside the normal web request cycle -- you're probably best off farming the operation out with delayed_job, or at the very least triggering the process with an AJAX request. Both of these give you the advantage that you can present a progress bar for the operation.